2017-07-30 12 views
1

下記のスクリーンショットに示すように期待される出力を得る方法を教えてください。密なランクを使用して希望の出力を得ることができません

DECLARE @TT TABLE (CUSTOMERID INT, TYPE VARCHAR(100) , D1 DATE) 
INSERT INTO @TT VALUES (15001,'TYPE1', '4/1/2017') 
INSERT INTO @TT VALUES (15001,'TYPE1', '4/2/2017') 
INSERT INTO @TT VALUES (15001,'TYPE1', '4/3/2017') 
INSERT INTO @TT VALUES (15001,'NON TYPE1', '4/4/2017') 
INSERT INTO @TT VALUES (15001,'NON TYPE1', '4/5/2017') 
INSERT INTO @TT VALUES (15001,'NON TYPE1', '4/6/2017') 
INSERT INTO @TT VALUES (245,'Non TYPE1', '4/1/2017') 
INSERT INTO @TT VALUES (245,'Non TYPE1', '4/2/2017') 
INSERT INTO @TT VALUES (245,'Non TYPE1', '4/3/2017') 
INSERT INTO @TT VALUES (245,'TYPE1', '4/4/2017') 
INSERT INTO @TT VALUES (245,'TYPE1', '4/5/2017') 
INSERT INTO @TT VALUES (245,'TYPE1', '4/6/2017') 

クエリです:

SELECT * , 
     DENSE_RANK() OVER (PARTITION BY CUSTOMERID ORDER BY CUSTOMERID,TYPE) DR 
FROM @TT 
WHERE CUSTOMERID = 15001 
ORDER BY CUSTOMERID,D1 

SELECT *, 
     DENSE_RANK() OVER (PARTITION BY CUSTOMERID ORDER BY CUSTOMERID,TYPE) DR 
FROM @TT 
WHERE CUSTOMERID = 245 
ORDER BY CUSTOMERID,D1 

enter image description here

助けてくれてありがとう。

+0

「ORDER BY TYPE DESC」を使用してください –

+0

はい、これは認識していますが、実際のデータにはAscとdescタイプのシナリオが混在しています。だからこれを使うことはできない。 問題のサンプルデータを変更して、 – Ram

答えて

1

グループを最小日数で注文したいと考えています。

SELECT t.*, 
     DENSE_RANK() OVER (PARTITION BY CUSTOMERID ORDER BY mind1, TYPE) DR 
FROM (SELECT t.*, MIN(d1) OVER (PARTITION BY CUSTOMERID, TYPE) as mind1 
     FROM @TT t 
    ) t 
WHERE CUSTOMERID = 15001 
ORDER BY CUSTOMERID, D1; 

これは一種の(あなたの例のように)タイプがインターリーブされていないことを前提としています。私はそれがこのようなものだと思います。そうであれば、別の質問をしてください。それは質問を大きく変えます。その質問は、より良いサンプルデータと望ましい結果を提供するはずです。

+0

パーフェクトシナリオを強調表示しました。ご協力いただきありがとうございます。 – Ram

関連する問題