Самый простой способ , вероятно:
select top (1) with ties l.*
from logdata l
order by row_number() over (partition by convert(date, log_date) order by log_date desc);
То есть никаких подзапросов не требуется.
С правильными индексами (т. Е. На logdata(log_date)
), наиболее эффективным, вероятно, является:
select ld.*
from logdata ld
where ld.log_date = (select max(ld2.log_date)
from logdata ld2
where ld2.log_date >= convert(date, ld.log_date) and
ld2.log_date < dateadd(day, 1, convert(date, ld2.log_date))
);
row_number()
- это «канонический» метод, полностью поддерживаемый стандартом SQL. Однако необходимо сопоставить номер строки каждой строке, так что это немного больше работы, чем коррелированный подзапрос.