Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara mendapatkan catatan dengan Max (tanggal) dan kemudian membandingkan nilai untuk mendapatkan hasil?

Ini adalah proses 3 langkah, pertama-tama beri peringkat catatan Anda untuk setiap kombinasi Akun/Pengukur menggunakan ROW_NUMBER()

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

OUTPUT

AccountNumber MeterNumber Tanggal Mulai Tanggal Akhir RateCode RowNumber
0142628117 123470203 22-04-2020 9999-12-31 ETF0_APR20 1
0142628117 123470203 10-10-2019 09-04-2020 ***Kustom*** 2
0142628117 123470205 22-04-2020 9999-12-31 ETF0_APR20 1
0142628117 123470205 10-10-2019 09-04-2020 ***Kustom*** 2
1363445 105238304 02-10-2018 -11-08-2019 ***Kustom*** 1
1363445 105238304 25-02-2016 22-04-2016 ***Kustom*** 2
1363445 130359929 12-12-2019 9999-12-31 ***Kustom*** 1

N.B. Beberapa data dipersingkat untuk ditampilkan dengan lebih baik

Kemudian Anda dapat memfilter untuk RowNumber =1 untuk mendapatkan tanggal akhir terbaru untuk setiap meter.

Selanjutnya Anda perlu menghitung kombinasi EndDate/RateCode yang berbeda, Anda tidak dapat menggunakan COUNT(DISTINCT ...) dalam fungsi berjendela, namun Anda dapat meniru ini menggunakan 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;

OUTPUT

AccountNumber MeterNumber Tanggal Mulai Tanggal Akhir RateCode CntDistinct
0142628117 123470203 22-04-2020 9999-12-31 ETF0_APR20 1
0142628117 123470205 22-04-2020 9999-12-31 ETF0_APR20 1
1363445 130359929 12-12-2019 9999-12-31 ***Kustom*** 2
1363445 105238304 02-10-2018 -11-08-2019 ***Kustom*** 2

N.B. Beberapa data dipersingkat untuk ditampilkan dengan lebih baik

Terakhir, masukkan semua ini ke dalam subkueri lebih lanjut dan batasi jika terdapat lebih dari satu kombinasi unik 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;

OUTPUT

AccountNumber MeterNumber Tanggal Mulai Tanggal Akhir RateCode
0500000178767001363445 TCA105238304 02-10-2018 -11-08-2019 ***Kustom***
0500000178767001363445 TCA130359929 12-12-2019 9999-12-31 ***Kustom***

Contoh pada db<>Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Temukan dan ganti string tertentu di kolom

  2. Perbarui kueri menggunakan Subquery di Sql Server

  3. Cara Memformat Tanggal &Waktu di SQL Server

  4. Ubah kolom di SQL Server

  5. Mengoptimalkan SQL Query untuk Menghitung saldo akun