Выберите уникальное значение с самой последней датой, группируя по другому значению - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть две соединенные таблицы, одна перечисляет идентификаторы устройств, другие идентификаторы и дату самой последней коллекции инвентаризации. Используя приведенный ниже запрос, я увижу что-то вроде этого:

SELECT d.DeviceName, d.DeviceID, r.InvDate FROM Device d
JOIN Report r on d.DeviceID = r.DeviceID
  • DeviceName DeviceID InvDate
  • Computer1 101 22/4/2020
  • Computer2 102 20/4 / 2020
  • Computer3 103 19/4/2020
  • Computer4 104 5/3/2020
  • Computer4 105 22/4/2020
  • Computer5 106 20 / 4/2020

Как вы можете видеть, некоторые имена могут быть дублированы.

Как извлечь список уникальных имен (РЕДАКТИРОВАТЬ: вместе с их идентификаторами) и самый последний инвентарь свидание? В каком-то идеальном мире я бы сделал ниже

SELECT d.DeviceID, MAX(r.InvDate) FROM Device d
JOIN Report r on d.DeviceID = r.DeviceID
GROUP BY d.DeviceName

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Вы также можете сделать это row_number().

select
    DeviceName,
    DeviceID,
    InvDate
from
(
    select
        DeviceName,
        d.DeviceID,
        InvDate,
        row_number() over (partition by DeviceName order by InvDate desc) as rnk
    from device
    join report r
    on d.DeviceID = r.DeviceID
) vals
where rnk = 1
order by    
    DeviceID
0 голосов
/ 23 апреля 2020

Я бы порекомендовал apply для этого:

SELECT d.DeviceID, d.DeviceName, r.*
FROM Device d OUTER APPLY
     (SELECT TOP (1) r.*
      FROM report r
      WHERE d.DeviceID = r.DeviceID
      ORDER BY r.InvDate DESC
     ) r;

Обратите внимание, что это более эффективно, чем использование ROW_NUMBER() (в целом), но это хорошее введение в боковые соединения.

...