Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“如何聚合”;“连续”;sql server中的记录?_Sql_Sql Server - Fatal编程技术网

“如何聚合”;“连续”;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