MS SQL 2012:查找数字序列

时间:2017-03-27 21:32:29

标签: sql-server sql-server-2012 number-sequence

我有一张这样的表:

    WITH S AS (
    SELECT 'B' type, 1 number
UNION SELECT 'B', 2
UNION SELECT 'B', 3
UNION SELECT 'B', 4
UNION SELECT 'B', 5
UNION SELECT 'A', 6
UNION SELECT 'A', 7
UNION SELECT 'B', 8
UNION SELECT 'B', 9
UNION SELECT 'B', 10
UNION SELECT 'C', 11
UNION SELECT 'A', 12
UNION SELECT 'B', 13
UNION SELECT 'B', 14
UNION SELECT 'B', 15
UNION SELECT 'B', 16
UNION SELECT 'B', 17
UNION SELECT 'A', 18
UNION SELECT 'C', 19
UNION SELECT 'B', 20
UNION SELECT 'B', 21
    ) 

如何为每种类型获得独特的数字序列(例如,3个或更多)? 例如。对于B 1~5,对于B 8~10 - ' B2'我怀疑应该有LEAD/LAGDENSE_RANK()的组合,但无法弄清楚如何申请。如果重要的话,数字是唯一的。

结果如下:

Type   Number  Sequence
-----------------------
B        1        B1
B        2        B1
B        3        B1
B        4        B1
B        5        B1
A        6        NULL
......................
B        8        B2
B        9        B2
B        10       B2
C        11       NULL
A        12       NULL
B        13       B3
....................
B        17       B3

2 个答案:

答案 0 :(得分:1)

一种方法是使用DENSE_RANK()和[{3}}之差的组合。

(c2,c3) > (1,1)
c2 > 1 OR ((c2 = 1) AND (c3 > 1))

答案 1 :(得分:0)

有一个回复,只是几分钟,它包含我想要的确切解决方案(其余我可以弄清楚):

SELECT type, R1 = min(number), R2 = max(number) FROM (
SELECT *, number - ROW_NUMBER() OVER (PARTITION BY type ORDER BY number) Grp From S
) A
GROUP BY type

无法评价答案 - 它已被删除。 解决方案是找到" Gaps and Islands" - 现在我知道了。