“如何聚合”;“连续”;sql server中的记录?
我有一张这样的桌子:“如何聚合”;“连续”;sql server中的记录?,sql,sql-server,Sql,Sql Server,我有一张这样的桌子: name date record A 20180725 1 A 20180725 2 B 20180721 5 B 20180721 7 B 20180721 8 B 20180721 9 我希望汇总“连续”记录,预期结果如下: name date r1 r
name date record
A 20180725 1
A 20180725 2
B 20180721 5
B 20180721 7
B 20180721 8
B 20180721 9
我希望汇总“连续”记录,预期结果如下:
name date r1 r2
A 20180725 1 2
B 20180721 5 5
B 20180721 7 9
其中,r1
和r2
是一组连续记录的开始和结束
如何在SQLServer中很好地实现这一点 您可以使用lead()
函数:
select name, min(record), max(record)
from ( select *, coalesce(lead(record) over (partition by date order by name) - record, 1) as grp
from table
) t
group by name, grp;
要在代码、日期上加分隔符
SELECT c1.name,
c1.[date],
c1.record,
OA.record
FROM contTable c1
OUTER APPLY(SELECT TOP 1 co.name,co.date, co.record FROM contTable co WHERE
co.record >= c1.record
AND
(
NOT EXISTS(SELECT 0 FROM conttable ce2 WHERE ce2.record = co.record + 1)
OR EXISTS (SELECT 0 FROM contTable ce4 WHERE ce4.record = co.record +1 AND (ce4.date != co.date OR ce4.name != co.name) )
)
ORDER BY co.record ASC) OA
WHERE NOT EXISTS(SELECT 0 FROM contTable ce WHERE ce.record = c1.record - 1)
OR
EXISTS (SELECT 0 FROM contTable ce3 WHERE ce3.record = c1.record - 1 AND (ce3.date != c1.date OR ce3.name != c1.name) )
这个问题是一个缺口和孤岛问题。在你的情况下,它有一个非常简单的解决方案。如果从
记录
中减去序列,则当记录
值为序列时,该值为常量
因此:
为什么输出中的第2行与第3行不连续-我的意思是为什么标记为不连续?还有,你决定开始和结束的顺序是什么,记录本身可能就是顺序吗?但是为什么第2行的r1=5,r2=9?它可以通过MIN和MAXI进行分组,因为对于
record
,@Cato,没有值为6
的行。这是什么版本的SQL Server?@Cato很抱歉描述不清。我想要的连续性基于整数级别的列记录
,聚合基于名称
和日期
。所以,如果您在原始表中插入一个record=6、record=5的行,那么在原始表中只会有一组Boutput@Larnu谢谢你的帮助解释,你明白我的意思了。我使用的是sql server 2012,如果名称或日期发生变化,但序列没有间隔,您是否也会切换到新组?
SELECT c1.name,
c1.[date],
c1.record,
OA.record
FROM contTable c1
OUTER APPLY(SELECT TOP 1 co.name,co.date, co.record FROM contTable co WHERE
co.record >= c1.record
AND
(
NOT EXISTS(SELECT 0 FROM conttable ce2 WHERE ce2.record = co.record + 1)
OR EXISTS (SELECT 0 FROM contTable ce4 WHERE ce4.record = co.record +1 AND (ce4.date != co.date OR ce4.name != co.name) )
)
ORDER BY co.record ASC) OA
WHERE NOT EXISTS(SELECT 0 FROM contTable ce WHERE ce.record = c1.record - 1)
OR
EXISTS (SELECT 0 FROM contTable ce3 WHERE ce3.record = c1.record - 1 AND (ce3.date != c1.date OR ce3.name != c1.name) )
SELECT
RES.[name], RES.[date], MIN(RES.[record]) AS [r1], MAX(RES.[record]) AS [r2]
FROM
(
SELECT
K.[record]-dense_rank() over(partition by K.[name], K.[date] order by K.[record]) AS X, K.*
FROM
TABLE K
) RES
GROUP BY RES.[name], RES.[date], RES.X
select name, date, min(record), max(record)
from (select name, date, record,
row_number() over (partition by name, date order by record) as seqnum
from t
) t
group by name, date, (record - seqnum)
select SS.name, SS.date, (
select TOP(1) record as [text()]
from t as FF
where FF.name = SS.name and FF.date = SS.date
order by name, date
FOR XML PATH('') ) as r1,
(
select TOP(1) r2_xml.hour as [text()]
from t as TT
where TT.name = SS.name and TT.date = SS.date
order by name, date, record desc
FOR XML PATH('') ) as r2
from t as SS
group by SS.name, SS.date
order by 1