Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да получа запис с Max(date) и след това да сравня стойностите, за да получа резултат

Това е процес от 3 стъпки, първо класирайте вашите записи за всяка комбинация акаунт/измервател, като използвате ROW_NUMBER()

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

ИЗХОД

AccountNumber MeterNumber Начална дата Крайна дата RateCode Номер на ред
0142628117 123470203 22.04.2020 9999-12-31 ETF0_APR20 1
0142628117 123470203 10.04.2019 09.04.2020 ***По избор*** 2
0142628117 123470205 22.04.2020 9999-12-31 ETF0_APR20 1
0142628117 123470205 10.04.2019 09.04.2020 ***По избор*** 2
1363445 105238304 2018-10-02 2019-08-11 ***По избор*** 1
1363445 105238304 25.02.2016 22.04.2016 ***По избор*** 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;

ИЗХОД

AccountNumber MeterNumber Начална дата Крайна дата 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 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;

ИЗХОД

AccountNumber MeterNumber Начална дата Крайна дата RateCode
0500000178767001363445 TCA105238304 2018-10-02 2019-08-11 ***По избор***
0500000178767001363445 TCA130359929 2019-08-12 9999-12-31 ***По избор***

Пример за 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. Как да изброя наличните екземпляри на SQL сървъри, използващи SMO ​​в C#?

  2. Заявка за SQL Server изберете 1 от всяка подгрупа

  3. SQL заявка - година по година ръст на продажбите

  4. Преобразуване на varchar в десетичен в sql сървър 2008

  5. Лоша производителност на променливата на таблицата при вмъкване в съхранена процедура на SQL Server