2016-05-02 10 views
0

私は、顧客のIDとステータスでグループ化されたテーブルから各ステータスの上位結果を時間順に取得しようとしています。年代順のグループ

与えられたデータ:

CustNo Date  Status 
1  2016-03-24 C 
1  2016-02-08 C 
1  2016-01-17 A 
1  2015-12-04 C 
2  2016-04-28 B 
2  2016-03-25 C 
2  2016-02-13 C 
2  2016-01-04 C 
3  2016-02-02 A 
3  2016-01-09 A 
3  2015-12-12 A 
3  2015-11-30 A 

私は、出力は次のようになりたい。(もしあれば)あなたが各々の中、私は、各ステータス変更のためのトップ日付を望ん見ることができるように

CustNo Date  Status 
1  2016-03-24 C 
1  2016-01-17 A 
1  2015-12-04 C 
2  2016-04-28 B 
2  2016-03-25 C 
3  2016-02-02 A 

顧客。私は顧客2と3のためにそれを解決しました。状況の変化がないか、状況は変わることはありませんが、顧客1はCからAに、そしてCに戻りました。 )。私はいつもCのステータスをまとめてグループ化しているようです。

答えて

0

これを試すことができます。

With CTE as 
{ 
    select CustNo, 
      DATE, 
      Status, 
      ROW_NUMBER() over (partition by CustNo order by date) as ord 
    from tab 
) 

SELECT CustNo, 
     DATE, 
     Status 
FROM CTE 
EXCEPT 
SELECT C1.CustNo, 
     C1.DATE, 
     C1.Status 
FROM CTE C1 
    INNER JOIN CTE C2 ON C1.CustNo = C2.CustNo 
         AND C1.Status = C2.Status 
         AND C1.ord + 1 = C2.ord 
+0

何があるかどう'C C C A C'ですか? – lad2025

0

あなたはグループを計算するために、ウィンドウ機能ROW_NUMBERを使用することができます。

WITH cte AS (
    SELECT *, 
    ROW_NUMBER() OVER(PARTITION BY CustNo ORDER BY Date) - 
    ROW_NUMBER() OVER(PARTITION BY CustNo, Status ORDER BY Date) AS grp 
    FROM mytable 
) 
SELECT CustNo, Status, MAX(Date) AS Date 
FROM cte 
GROUP BY CustNo, Status, grp 
ORDER BY CustNo, Date DESC; 

LiveDemo

出力:

╔════════╦════════╦═════════════════════╗ 
║ CustNo ║ Status ║  Date   ║ 
╠════════╬════════╬═════════════════════╣ 
║  1 ║ C  ║ 24.03.2016 00:00:00 ║ 
║  1 ║ A  ║ 17.01.2016 00:00:00 ║ 
║  1 ║ C  ║ 04.12.2015 00:00:00 ║ 
║  2 ║ B  ║ 28.04.2016 00:00:00 ║ 
║  2 ║ C  ║ 25.03.2016 00:00:00 ║ 
║  3 ║ A  ║ 02.02.2016 00:00:00 ║ 
╚════════╩════════╩═════════════════════╝ 
関連する問題