我需要找到一种以特定方式Group By
来存储某些数据的方法。
id Number FROM TO
1 240 201710 201712
1 240 201712 201801
1 240 201801 201803
1 300 201803 201805
1 240 201805 999999
我需要以这种方式将它们分组:
id TEXT
1 201710 - 201803: 240, 201803 - 20180: 300, 201805 - 999999: 240
我的问题是进行正确的分组。它必须将第1-3行分组,并将FROM
设置为201710
,并将TO
设置为201803
。但是我不能按数字分组,因为它以后可能会再次更改。
有什么想法吗?
我唯一的想法是检查FROM与下一行的FROM,并将其设置为前一个FROM(如果数字匹配)。然后我可以按id, number
和FROM
分组,并取MAX
的{{1}}。但是我真的不想使用游标。
这里有一个抄本:
TO
答案 0 :(得分:5)
尝试一下:
;WITH cte AS (
SELECT t.customerid,
t.Number,
t.DateFrom,
t.DateTo,
ROW_NUMBER() over (order by datefrom) - ROW_NUMBER() over (partition by number order by datefrom) grpCol
FROM @Test t
), cte2 AS (
SELECT customerid,
cast(MIN(datefrom) as varchar(10)) + ' - ' + cast(MAX(dateto) as varchar(10)) + ': ' + cast(number as varchar(10)) [text],
MIN(datefrom) datefrom
FROM cte c
group by customerid, number, grpCol
)
SELECT customerid,
(select [text] + ', ' from cte2 where customerid = c.customerid order by datefrom for xml path('')) [text]
FROM cte2 c
GROUP BY customerid
输出:
customerid | text
1 | 201710 - 201803: 240, 201803 - 201805: 300, 201805 - 999999: 240,