June 14, 2005 at 4:14 pm
Frank Kalis gave me some code off-line that might help. I am rather thick-skulled, so he had to give two versions - the use of modulo made more sense to me.
If this helps, thank Frank:
--Farrell, you can either use '19000101' or 0.
CREATE TABLE #time( [ID] INT IDENTITY,
dt DATETIME,
ReasonID INT)
INSERT INTO #time
SELECT '20050427 10:50:00', NULL -- 1
UNION ALL
SELECT '20050427 10:51:00', NULL -- 2
UNION ALL
SELECT '20050427 10:52:00', NULL -- 3
UNION ALL
SELECT '20050427 10:53:00', 20206 -- 4
UNION ALL
SELECT '20050427 10:54:00', 20206 -- 5
UNION ALL
SELECT '20050427 10:55:00', NULL -- 6
UNION ALL
SELECT '20050427 10:56:00', 20212 -- 7
SELECT CONVERT( varchar(1), [ID]) AS [ID],
DATEADD( minute, -DATEPART( minute, dt) % 5, dt) AS DateByFiveSeconds,
-DATEPART( minute, dt) % 5 AS Modulo,
dt
FROM #time
DROP TABLE #time
-- Both will produce the same result. The former is interpreted by SQL Server as a date by converting the string to a DATETIME.
-- The latter is converted from an INT to DATETIME. In both cases it's the server's base date.
-- Basically it's the same trick you can use to set the time in a DATETIME column to midnight.
-- This technique works with all the allowed parameters for DATEADD and DATEDIFF.
-- Here it strips off the seconds and milliseconds.
/*
SELECT DATEADD( minute, DATEDIFF( minute, 0, dt) / 5 * 5, 0),
COUNT(*) - SUM( CASE WHEN ReasonID IS NULL THEN 0 ELSE 1 END) AS Running,
COUNT(*) - SUM( CASE WHEN ReasonID IS NOT NULL THEN 0 ELSE 1 END) AS Down
FROM #time
GROUP BY DATEADD( minute, DATEDIFF( minute, 0, dt) / 5 * 5, 0)
*/
I wasn't born stupid - I had to study.
June 15, 2005 at 7:50 am
Is this solution working for you or I still need to knock it out?
June 15, 2005 at 8:14 am
I am still working with the above hint.Not successful so far.
June 15, 2005 at 9:06 am
Id
----
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
----
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
----
7688
----
7695
7696
7697
7698
-----
7700
-----
IF I have these Ids with me and the data between the two dashed lines is a series of contiguius data.
how can I get the following result. Starting and ending ids of the series.
7539-7513
7596-7568
7688-7688
7698-7695
7700-7700
Thanks.
June 15, 2005 at 10:04 am
-- create table ids( n int)
-- insert into ids (n) values (7535)
-- insert into ids (n) values (7536)
-- insert into ids (n) values (7537)
-- insert into ids (n) values (7538)
-- insert into ids (n) values (7539)
-- insert into ids (n) values (7568)
-- insert into ids (n) values (7569)
-- insert into ids (n) values (7570)
-- insert into ids (n) values (7571)
-- insert into ids (n) values (7572)
-- insert into ids (n) values (7573)
-- insert into ids (n) values (7574)
-- insert into ids (n) values (7575)
-- insert into ids (n) values (7576)
-- insert into ids (n) values (7577)
-- insert into ids (n) values (7578)
-- insert into ids (n) values (7579)
-- insert into ids (n) values (7580)
-- insert into ids (n) values (7581)
-- insert into ids (n) values (7582)
-- insert into ids (n) values (7583)
-- insert into ids (n) values (7584)
-- insert into ids (n) values (7585)
-- insert into ids (n) values (7586)
-- insert into ids (n) values (7587)
-- insert into ids (n) values (7588)
-- insert into ids (n) values (7589)
-- insert into ids (n) values (7590)
-- insert into ids (n) values (7591)
-- insert into ids (n) values (7592)
-- insert into ids (n) values (7593)
-- insert into ids (n) values (7594)
-- insert into ids (n) values (7595)
-- insert into ids (n) values (7596)
-- insert into ids (n) values (7688)
-- insert into ids (n) values (7695)
-- insert into ids (n) values (7696)
-- insert into ids (n) values (7697)
-- insert into ids (n) values (7698)
-- insert into ids (n) values (7700)
select start
,(select min(i3.n)
from ids i3
where i3.n >= n1.start
and not exists (select* from ids i4 where i4.n = i3.n +1 )) as [end]
from
(
select n as start
from ids i1
where
not exists (select *
from ids i2
where i2.n = i1.n -1)
) n1
hth
* Noel
June 16, 2005 at 1:18 pm
Looking at the required result
number name result start_date
89277 xxxx no 8/11/05 5:12 AM
89287 xxxx no 8/11/05 5:22 AM
86405 xxxx yes 8/9/05 5:01 AM
90000 xxxx no 9/9/04 5:15 AM
Should the last record be there? The date range for that set of 10 is 9/9/04 to 9/15/04... I do see that the times are consecutive though.
June 17, 2005 at 9:01 am
num name
7534 tt
7535 tt
7536 tt
7537 nn
7538 nn
7539 tt
From the above data set how can get the following result
start end name
7534 7536 tt
7537 7538 nn
7539 7539 tt
How can I get the above resukt.
Thanks.
June 17, 2005 at 9:07 am
sahana smthing similar :
http://www.sqlservercentral.com/forums/shwmessage.aspx?forumid=8&messageid=191316#bm191447
Vasc
June 17, 2005 at 9:10 am
I'm still looking at it and I still don't get it... can you share the idea behind this technic?
June 17, 2005 at 9:22 am
I m using pair of consecutive rows from a self join
row1 will pair with row2
and I extract the rows where is a variance in group value
for example from 50 to 100 or 50 to null
and by picking the 2 rows that do the variance I obtain in 1 case the min from a group and afther that the max for a group (in the two derived tables)
after this I join the tables and I eliminate the unwanted rows MIN> MAX and by selecting the pairs with the same MAX that has the MAX(MIN) : )) otherwise it means that the pair is not good
: )
Vasc
June 17, 2005 at 9:27 am
Looks like I didn't go to school long enough .
Thanx for the tip.
June 17, 2005 at 9:38 am
Still I could not make the solution with ur tip. Can anyone give the straight solution to my problem.
Thanks.
June 17, 2005 at 9:42 am
Sahana can you post your table + sample data (declare @t table....
insert so I just copy in queryAnalixzer : )
and the result that you want
Vasc
June 17, 2005 at 9:54 am
create table #ids( n int,name varchar(20))
insert into #ids (n,name) values (7534,'tt')
insert into #ids (n,name) values (7535,'tt')
insert into #ids (n,name) values (7536,'tt')
insert into #ids (n,name) values (7537,'nn')
insert into #ids (n,name) values (7538,'nn')
insert into #ids (n,name) values (7539,'tt')
Start end COunt name
7534 7536 3 tt
7537 7538 2 nn
7539 7539 1 tt
June 17, 2005 at 10:07 am
create table #ids( n int,name varchar(20))
insert into #ids (n,name) values (7534,'tt')
insert into #ids (n,name) values (7535,'tt')
insert into #ids (n,name) values (7536,'tt')
insert into #ids (n,name) values (7537,'nn')
insert into #ids (n,name) values (7538,'nn')
insert into #ids (n,name) values (7539,'tt')
/*
Start end COunt name
7534 7536 3 tt
7537 7538 2 nn
7539 7539 1 tt
*/
SELECT X.name,MAX(Y.n),X.n,X.n-MAX(Y.n)+1 as Count
FROM
(SELECT a.n,a.name
FROM #ids a LEFT OUTER JOIN #ids b
ON a.name=b.name AND a.n=b.n-1
WHERE b.name IS NULL
) X
INNER JOIN
(SELECT a.n,a.name
FROM #ids a LEFT OUTER JOIN #ids b
ON a.name=b.name AND a.n=b.n+1
WHERE b.name IS NULL
) Y
ON X.name=Y.name
WHERE Y.n<=X.n
GROUP BY X.name,X.n
DROP TABLE #ids
Vasc
Viewing 15 posts - 16 through 29 (of 29 total)
You must be logged in to reply to this topic. Login to reply