2017-03-27 24 views
-1

我有這樣的一個表:MS SQL 2012:發現號序列

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,會有'B1',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

我不明白你在這裏要做什麼。你能解釋一下這些要求嗎? –

回答

1

一種方法是使用的DENSE_RANK()組合和row numbers的差異。

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 
    ) 
SELECT type, 
     number, 
     sequence = CASE 
      WHEN type = 'B' 
      THEN 'B' + CAST(DENSE_RANK() OVER (ORDER BY CASE WHEN type = 'B' THEN 0 ELSE 1 END, RN) AS VARCHAR(10)) 
      END 
FROM (
    SELECT *, RN = ROW_NUMBER() OVER (ORDER BY number) - ROW_NUMBER() OVER (PARTITION BY type ORDER BY number) 
    FROM S 
    ) AS T 
ORDER BY number; 
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 

無法評價答案 - 它已經當時刪除。 解決的辦法是找到「差距和島嶼」 - 現在我知道了。