2017-03-27 13 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の場合、B 8〜10 - 'B2'などの場合は「B1」のようなものがあります。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 

答えを評価できませんでした - それはすでにでしたそれまでに削除されました。 解決策は「ギャップとアイランド」を見つけることです。今は分かります。

関連する問題