34,590
社区成员
发帖
与我相关
我的任务
分享
with t1 as(
select 'A1' c1,'2014-6-26 18:00:00' c2
union all select 'A1','2014-6-26 18:02:00'
union all select 'A1','2014-6-26 18:05:00'
union all select 'A1','2014-6-26 18:07:00'
union all select 'A1','2014-6-26 18:11:00'
union all select 'A1','2014-6-26 18:12:00'
union all select 'A1','2014-6-26 18:14:00'
union all select 'B1','2014-6-26 18:02:00'
union all select 'B1','2014-6-26 18:06:00'
union all select 'B1','2014-6-26 18:08:00'
union all select 'B1','2014-6-26 18:12:00'
union all select 'B1','2014-6-26 18:14:00'
)
,t2 as(
select (row_number() over (partition by c1 order by c2)) id,*,min(c2) over(partition by c1) c3
from t1
)
,t3 as(
select *
from t2
where id=1
union all
select t2.id,t2.c1,t2.c2,
case when datediff(mi,t3.c3,t2.c2)>=5 then t2.c2 else t3.c3 end
from t2 inner join t3
on t2.c1=t3.c1 and t2.id=t3.id+1
)
select * from t3 where c2=c3 order by c1,c2
declare @galenkeny table(C1 VARCHAR(10),C2 DATETIME)
insert into @galenkeny
SELECT 'A1', '2014-6-26 18:00:00' union all
select 'A1', '2014-6-26 18:04:00' union all
select 'A1', '2014-6-26 18:08:00'
;WITH cte AS
(SELECT *,rn=ROW_NUMBER()OVER(PARTITION BY C1 ORDER BY C2 DESC ) FROM @galenkeny)
SELECT C1,C2 FROM cte
WHERE rn IN(1,3) ORDER BY C2
[/quote]
这个不满足需求[/quote]
你给出的例子这个是满足你期望结果的。或者你多列出数据,写出正确的期望结果
WITH T1(C1,C2) AS(
SELECT 'A1' ,'2014-6-26 18:00:00'
UNION ALL SELECT 'A1','2014-6-26 18:02:00'
UNION ALL SELECT 'A1','2014-6-26 18:06:00'
UNION ALL SELECT 'A1','2014-6-26 18:08:00'
UNION ALL SELECT 'A1','2014-6-26 18:12:00'
UNION ALL SELECT 'A1','2014-6-26 18:14:00'
UNION ALL SELECT 'B1','2014-6-23 17:00:00'
UNION ALL SELECT 'B1','2014-6-23 17:01:00'
UNION ALL SELECT 'B1','2014-6-23 17:08:00'
UNION ALL SELECT 'B1','2014-6-23 17:18:00'
UNION ALL SELECT 'C1','2014-6-24 19:00:00'
UNION ALL SELECT 'C1','2014-6-24 19:07:00'
UNION ALL SELECT 'C1','2014-6-24 19:08:00'
UNION ALL SELECT 'C1','2014-6-24 19:18:00'
)
,t2 AS (
SELECT *
,ROW_NUMBER() OVER(ORDER BY c1,c2) AS ID
,ROW_NUMBER() OVER(PARTITION BY c1 ORDER BY c2) AS ID1
,MIN(c2) OVER(PARTITION BY c1) AS mintime
FROM t1
)
,t3 AS (
SELECT *,CAST(mintime AS DATETIME ) AS c3 FROM t2 WHERE ID=1 AND ID1=1
UNION ALL
SELECT A.*,CASE WHEN A.c1=B.c1 THEN (CASE WHEN DATEADD(MINUTE,5,CAST(B.c3 AS DATETIME))>=CAST(A.c2 AS datetime)
THEN CAST(B.c3 AS datetime) ELSE CAST(A.c2 AS DATETIME) END ) ELSE CAST(A.c2 AS datetime) END
FROM t2 AS A,t3 AS B
WHERE A.ID=B.ID+1
)
SELECT ID1, c1,c2
FROM t3
WHERE c2=c3
/*
ID1 c1 c2
1 A1 2014-6-26 18:00:00
3 A1 2014-6-26 18:06:00
5 A1 2014-6-26 18:12:00
1 B1 2014-6-23 17:00:00
3 B1 2014-6-23 17:08:00
4 B1 2014-6-23 17:18:00
1 C1 2014-6-24 19:00:00
2 C1 2014-6-24 19:07:00
4 C1 2014-6-24 19:18:00
*/
WITH cte as
(
SELECT top 1 C1,C2,C3 FROM T1 WHERE C1 = 'A1'
UNION ALL
SELECT top 1 a.C1,a.C2,a.C3 FROM T1 a,cte b
where a.C1 = b.C1 and a.C3 - b.C3 > 5分钟 //时间比较自己写
)
SELECT * from cte
拿去自己改改,没环境测试,我只写了a1数据,如果要其他一起,你自己改 UNION上面代码,用分组排序取每个c1的第一条数据declare @galenkeny table(C1 VARCHAR(10),C2 DATETIME)
insert into @galenkeny
SELECT 'A1', '2014-6-26 18:00:00' union all
select 'A1', '2014-6-26 18:04:00' union all
select 'A1', '2014-6-26 18:08:00'
;WITH cte AS
(SELECT *,rn=ROW_NUMBER()OVER(PARTITION BY C1 ORDER BY C2 DESC ) FROM @galenkeny)
SELECT C1,C2 FROM cte
WHERE rn IN(1,3) ORDER BY C2
[/quote]
这个不满足需求