Вы можете фильтровать с помощью подзапроса:
select e.*
from emps e
where e.id = (
select top (1) id
from emps e1
where e1.name = e.name
order by e1.dateon desc, e1.dateoff desc
)
Не очень понятно, какие критерии сортировки вы хотите; это дает вам запись, которая имеет последнюю dateon
; если есть связи, dateoff
используется для их разрыва. Возможно, вы захотите адаптировать условие order by
подзапроса в соответствии с вашими точными требованиями.
Это решение обычно достаточно эффективно, даже для большого набора данных. Для производительности вам нужен индекс на (name, dateon, dateoff)
. Вы также можете попытаться добавить id
в последнюю позицию в индексе, например (name, dateon, dateoff, id)
: это делает Inde охватывающим , что означает, что база данных может быть в состоянии выполнить подзапрос, просматривая только индекс .
Демонстрация на DB Fiddle
Пример данных:
Id | NAME | AlarmOnTimeStamp | AlarmOffTimeStamp
-: | :---- | :-------------------------- | :--------------------------
1 | Test1 | 2020-04-09 01:56:29.5070000 | <em>null</em>
2 | Test1 | 2020-04-09 01:56:29.5070000 | 2020-04-09 03:56:29.5070000
3 | Test2 | 2020-04-09 01:56:29.5070000 | 2020-04-09 03:56:29.5070000
Результаты:
Id | NAME | AlarmOnTimeStamp | AlarmOffTimeStamp
-: | :---- | :-------------------------- | :--------------------------
2 | Test1 | 2020-04-09 01:56:29.5070000 | 2020-04-09 03:56:29.5070000
3 | Test2 | 2020-04-09 01:56:29.5070000 | 2020-04-09 03:56:29.5070000