Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 按顺序编号的值组(包括重复)_Sql_Sql Server_Datetime_Window Functions_Gaps And Islands - Fatal编程技术网

Sql 按顺序编号的值组(包括重复)

Sql 按顺序编号的值组(包括重复),sql,sql-server,datetime,window-functions,gaps-and-islands,Sql,Sql Server,Datetime,Window Functions,Gaps And Islands,我有下表: IF OBJECT_ID('tempdb..#Temp') IS NOT NULL DROP TABLE #Temp CREATE TABLE #Temp ( ID INT, Category VARCHAR(100), [Date] DATE ) INSERT INTO #Temp VALUES (1,'AAA','20200625'), (1,'BBB','20200626'), (1,'BBB','20200627'), (1,'AAA','2

我有下表:

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
    DROP TABLE #Temp
CREATE TABLE #Temp
(
    ID INT,
    Category VARCHAR(100),
    [Date] DATE
)
INSERT INTO #Temp VALUES 
(1,'AAA','20200625'),
(1,'BBB','20200626'),
(1,'BBB','20200627'),
(1,'AAA','20200628'),
(1,'AAA','20200629'),
(1,'BBB','20200630'),
(1,'AAA','20200701'),
(2,'AAA','20200625'),
(2,'BBB','20200626'),
(2,'BBB','20200627'),
(2,'AAA','20200628'),
(2,'AAA','20200629'),
(2,'BBB','20200630'),
(2,'AAA','20200701')
我不知道如何将一个连续整数分配给这样的类别:

ID  Category    Date        GroupNumber
-------------------------------------------
1   AAA         25/06/2020  1
1   BBB         26/06/2020  2
1   BBB         27/06/2020  2
1   AAA         28/06/2020  3
1   AAA         29/06/2020  3
1   BBB         30/06/2020  4
1   AAA         01/07/2020  5
2   AAA         25/06/2020  1
2   BBB         26/06/2020  2
2   BBB         27/06/2020  2
2   AAA         28/06/2020  3
2   AAA         29/06/2020  3
2   BBB         30/06/2020  4
2   AAA         01/07/2020  5
ID  Category    Date        DateFrom    DateTo
--------------------------------------------------
1   AAA         25/06/2020  25/06/2020  25/06/2020
1   BBB         26/06/2020  26/06/2020  27/06/2020
1   AAA         28/06/2020  28/06/2020  29/06/2020
1   BBB         30/06/2020  30/06/2020  30/06/2020
1   AAA         01/07/2020  01/07/2020  01/07/2020
2   AAA         25/06/2020  25/06/2020  25/06/2020
2   BBB         26/06/2020  26/06/2020  27/06/2020
2   AAA         28/06/2020  28/06/2020  29/06/2020
2   BBB         30/06/2020  30/06/2020  30/06/2020
2   AAA         01/07/2020  01/07/2020  01/07/2020
我尝试了不同的窗口函数组合,但没有成功。目标是将数据上卷,使其看起来像这样:

ID  Category    Date        GroupNumber
-------------------------------------------
1   AAA         25/06/2020  1
1   BBB         26/06/2020  2
1   BBB         27/06/2020  2
1   AAA         28/06/2020  3
1   AAA         29/06/2020  3
1   BBB         30/06/2020  4
1   AAA         01/07/2020  5
2   AAA         25/06/2020  1
2   BBB         26/06/2020  2
2   BBB         27/06/2020  2
2   AAA         28/06/2020  3
2   AAA         29/06/2020  3
2   BBB         30/06/2020  4
2   AAA         01/07/2020  5
ID  Category    Date        DateFrom    DateTo
--------------------------------------------------
1   AAA         25/06/2020  25/06/2020  25/06/2020
1   BBB         26/06/2020  26/06/2020  27/06/2020
1   AAA         28/06/2020  28/06/2020  29/06/2020
1   BBB         30/06/2020  30/06/2020  30/06/2020
1   AAA         01/07/2020  01/07/2020  01/07/2020
2   AAA         25/06/2020  25/06/2020  25/06/2020
2   BBB         26/06/2020  26/06/2020  27/06/2020
2   AAA         28/06/2020  28/06/2020  29/06/2020
2   BBB         30/06/2020  30/06/2020  30/06/2020
2   AAA         01/07/2020  01/07/2020  01/07/2020

这是一个间隙和孤岛问题,您希望将“相邻行”分组在一起。要获得您想要的最终结果,最简单的方法可能是使用行号之间的差异来标识组:

select id, category, min(date) datefrom, max(date) dateto
from (
    select t.*, 
        row_number() over(partition by id order by date) rn1,
        row_number() over(partition by id, category order by date) rn2
    from #temp t
) t
group by id, category, rn1 - rn2
order by id, datefrom

id | category | datefrom | dateto -: | :------- | :--------- | :--------- 1 | AAA | 2020-06-25 | 2020-06-25 1 | BBB | 2020-06-26 | 2020-06-27 1 | AAA | 2020-06-28 | 2020-06-29 1 | BBB | 2020-06-30 | 2020-06-30 1 | AAA | 2020-07-01 | 2020-07-01 2 | AAA | 2020-06-25 | 2020-06-25 2 | BBB | 2020-06-26 | 2020-06-27 2 | AAA | 2020-06-28 | 2020-06-29 2 | BBB | 2020-06-30 | 2020-06-30 2 | AAA | 2020-07-01 | 2020-07-01 id |类别|日期从|日期到 -: | :------- | :--------- | :--------- 1 | AAA | 2020-06-25 | 2020-06-25 1 | BBB | 2020-06-26 | 2020-06-27 1 | AAA | 2020-06-28 | 2020-06-29 1 | BBB | 2020-06-30 | 2020-06-30 1 | AAA | 2020-07-01 | 2020-07-01 2 | AAA | 2020-06-25 | 2020-06-25 2 | BBB | 2020-06-26 | 2020-06-27 2 | AAA | 2020-06-28 | 2020-06-29 2 | BBB | 2020-06-30 | 2020-06-30 2 | AAA | 2020-07-01 | 2020-07-01
这是一个间隙和孤岛问题,您希望将“相邻行”分组在一起。要获得您想要的最终结果,最简单的方法可能是使用行号之间的差异来标识组:

select id, category, min(date) datefrom, max(date) dateto
from (
    select t.*, 
        row_number() over(partition by id order by date) rn1,
        row_number() over(partition by id, category order by date) rn2
    from #temp t
) t
group by id, category, rn1 - rn2
order by id, datefrom

id | category | datefrom | dateto -: | :------- | :--------- | :--------- 1 | AAA | 2020-06-25 | 2020-06-25 1 | BBB | 2020-06-26 | 2020-06-27 1 | AAA | 2020-06-28 | 2020-06-29 1 | BBB | 2020-06-30 | 2020-06-30 1 | AAA | 2020-07-01 | 2020-07-01 2 | AAA | 2020-06-25 | 2020-06-25 2 | BBB | 2020-06-26 | 2020-06-27 2 | AAA | 2020-06-28 | 2020-06-29 2 | BBB | 2020-06-30 | 2020-06-30 2 | AAA | 2020-07-01 | 2020-07-01 id |类别|日期从|日期到 -: | :------- | :--------- | :--------- 1 | AAA | 2020-06-25 | 2020-06-25 1 | BBB | 2020-06-26 | 2020-06-27 1 | AAA | 2020-06-28 | 2020-06-29 1 | BBB | 2020-06-30 | 2020-06-30 1 | AAA | 2020-07-01 | 2020-07-01 2 | AAA | 2020-06-25 | 2020-06-25 2 | BBB | 2020-06-26 | 2020-06-27 2 | AAA | 2020-06-28 | 2020-06-29 2 | BBB | 2020-06-30 | 2020-06-30 2 | AAA | 2020-07-01 | 2020-07-01