これは 3 ステップのプロセスです。最初に、ROW_NUMBER() を使用して、アカウントとメーターの組み合わせごとにレコードをランク付けします。
SELECT *,
RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber
ORDER BY EndDate DESC)
FROM Meter
アウトプット
アカウント番号 | メーター番号 | 開始日 | 終了日 | 料金コード | 行番号 |
スレッド> 0142628117 | 123470203 | 2020-04-22 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470203 | 2019-04-10 | 2020-04-09 | ***カスタム*** | 2 |
0142628117 | 123470205 | 2020-04-22 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470205 | 2019-04-10 | 2020-04-09 | ***カスタム*** | 2 |
1363445 | 105238304 | 2018-10-02 | 2019-08-11 | ***カスタム*** | 1 |
1363445 | 105238304 | 2016-02-25 | 2016-04-22 | ***カスタム*** | 2 |
1363445 | 130359929 | 2019-08-12 | 9999-12-31 | ***カスタム*** | 1 |
表>
N.B.一部のデータは、表示を改善するために短縮されています
その後、RowNumber =1 でフィルター処理して、各メーターの最新の終了日を取得できます。
次に、個別の EndDate/RateCode の組み合わせをカウントする必要があります。COUNT(DISTINCT ...)
は使用できません。 ただし、DENSE_RANK()
を使用してこれをエミュレートできます。 :
SELECT *,
CntDistinct = DENSE_RANK() OVER(PARTITION BY AccountNumber
ORDER BY EndDate, RateCode)
+ DENSE_RANK() OVER(PARTITION BY AccountNumber
ORDER BY EndDate DESC, RateCode DESC) - 1
FROM ( SELECT *,
RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber
ORDER BY EndDate DESC)
FROM Meter AS m
) AS m
WHERE m.RowNumber = 1;
アウトプット
アカウント番号 | メーター番号 | 開始日 | 終了日 | 料金コード | CntDistinct |
スレッド> 0142628117 | 123470203 | 2020-04-22 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470205 | 2020-04-22 | 9999-12-31 | ETF0_APR20 | 1 |
1363445 | 130359929 | 2019-08-12 | 9999-12-31 | ***カスタム*** | 2 |
1363445 | 105238304 | 2018-10-02 | 2019-08-11 | ***カスタム*** | 2 |
表>
N.B.一部のデータは、表示を改善するために短縮されています
最後に、これらすべてを追加のサブクエリに入れ、EndDate/RateCode の一意の組み合わせが複数ある場所に制限します:
SELECT AccountNumber, MeterNumber, StartDate, EndDate, RateCode
FROM ( SELECT *,
CntDistinct = DENSE_RANK() OVER(PARTITION BY AccountNumber
ORDER BY EndDate, RateCode)
+ DENSE_RANK() OVER(PARTITION BY AccountNumber
ORDER BY EndDate DESC, RateCode DESC) - 1
FROM ( SELECT *,
RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber
ORDER BY EndDate DESC)
FROM Meter AS m
) AS m
WHERE m.RowNumber = 1
) AS m
WHERE m.CntDistinct > 1;
アウトプット
アカウント番号 | メーター番号 | 開始日 | 終了日 | 料金コード |
スレッド> 0500000178767001363445 | TCA105238304 | 2018-10-02 | 2019-08-11 | ***カスタム*** |
0500000178767001363445 | TCA130359929 | 2019-08-12 | 9999-12-31 | ***カスタム*** |
表>
データベースの例<>Fiddle