Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để lấy bản ghi với Max (ngày) và sau đó so sánh các giá trị để nhận kết quả

Đây là quy trình 3 bước, trước tiên hãy xếp hạng hồ sơ của bạn cho từng kết hợp Tài khoản / Mét bằng cách sử dụng ROW_NUMBER ()

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

ĐẦU RA

Số tài khoản Số Mét Ngày bắt đầu Ngày kết thúc Mã tỷ lệ RowNumber
0142628117 123470203 2020-04-22 9999-12-31 ETF0_APR20 1
0142628117 123470203 2019-04-10 2020-04-09 *** Tùy chỉnh *** 2
0142628117 123470205 2020-04-22 9999-12-31 ETF0_APR20 1
0142628117 123470205 2019-04-10 2020-04-09 *** Tùy chỉnh *** 2
1363445 105238304 2018-10-02 2019-08-11 *** Tùy chỉnh *** 1
1363445 105238304 2016-02-25 2016-04-22 *** Tùy chỉnh *** 2
1363445 130359929 2019-08-12 9999-12-31 *** Tùy chỉnh *** 1

N.B. Một số dữ liệu được rút ngắn để hiển thị tốt hơn

Sau đó, bạn có thể lọc RowNumber =1 để có ngày kết thúc mới nhất cho mỗi mét.

Tiếp theo, bạn cần đếm các kết hợp EndDate / RateCode riêng biệt, bạn không thể sử dụng COUNT(DISTINCT ...) trong một hàm cửa sổ, tuy nhiên, bạn có thể mô phỏng điều này bằng cách sử dụng 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;

ĐẦU RA

Số tài khoản Số Mét Ngày bắt đầu Ngày kết thúc Mã tỷ lệ 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 *** Tùy chỉnh *** 2
1363445 105238304 2018-10-02 2019-08-11 *** Tùy chỉnh *** 2

N.B. Một số dữ liệu được rút ngắn để hiển thị tốt hơn

Cuối cùng, đặt tất cả những điều này vào một truy vấn con hơn nữa và giới hạn ở nơi có nhiều hơn một sự kết hợp duy nhất của 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;

ĐẦU RA

Số tài khoản Số Mét Ngày bắt đầu Ngày kết thúc Mã tỷ lệ
0500000178767001363445 TCA105238304 2018-10-02 2019-08-11 *** Tùy chỉnh ***
0500000178767001363445 TCA130359929 2019-08-12 9999-12-31 *** Tùy chỉnh ***

Ví dụ trên 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. Phương pháp chính xác để xóa hơn 2100 hàng (theo ID) với Dapper

  2. Nhận số lượng và hàng trong cùng một truy vấn

  3. Sao lưu một bảng duy nhất với dữ liệu của nó từ cơ sở dữ liệu trong sql server 2008

  4. Hành vi ROW_NUMBER của Máy chủ SQL

  5. Azure Data Studio là gì?