sql >> データベース >  >> RDS >> Sqlserver

Max(date) でレコードを取得し、値を比較して結果を取得するにはどうすればよいですか

    これは 3 ステップのプロセスです。最初に、ROW_NUMBER() を使用して、アカウントとメーターの組み合わせごとにレコードをランク​​付けします。

    SELECT *,
          RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber 
                                        ORDER BY EndDate DESC)
    FROM Meter
    

    アウトプット

    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;
    

    アウトプット

    アカウント番号 メーター番号 開始日 終了日 料金コード 行番号
    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.一部のデータは、表示を改善するために短縮されています

    最後に、これらすべてを追加のサブクエリに入れ、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;
    

    アウトプット

    アカウント番号 メーター番号 開始日 終了日 料金コード 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

    データベースの例<>Fiddle




    1. SQLのアクセントを無視して文字列を比較する(ORACLE)

    2. より効率的なものは何ですか?SQLデータベースまたはファイルにログを保存しますか?

    3. SQL Developer:システム統計を収集できません:権限が不十分です

    4. MySQL-CASEで複数のWHEN条件を組み合わせる

    アカウント番号 メーター番号 開始日 終了日 料金コード
    0500000178767001363445 TCA105238304 2018-10-02 2019-08-11 ***カスタム***
    0500000178767001363445 TCA130359929 2019-08-12 9999-12-31 ***カスタム***