Выберите только последнюю дату и время - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть таблица logdata (база данных MS SQL Server 2012):

id  full_name   log_date  
1   Name1       2020-01-07 06:43:35.283  
2   Name2       2020-01-07 08:12:26.153  
3   Name3       2020-01-07 08:23:38.640  
4   Name4       2020-01-07 08:27:03.953  
5   Name1       2020-01-08 09:31:35.393  
6   Name5       2020-01-08 09:44:46.753  
7   Name2       2020-01-08 10:16:30.340  
8   Name6       2020-01-09 06:33:41.220  
9   Name3       2020-01-09 10:35:25.843  
10  Name1       2020-01-09 15:45:58.753  

log_date - дата-время.

Я хочу получить только последнее время журнала для каждого дата в таблице. Результат должен быть:

id  full_name   log_date  
4   Name4       2020-01-07 08:27:03.953  
7   Name2       2020-01-08 10:16:30.340  
10  Name1       2020-01-09 15:45:58.753  

Заранее спасибо.

Aage Svanholm

Ответы [ 5 ]

1 голос
/ 13 февраля 2020

использовать row_number() с partition by датой convert(date, log_date)

select *
from   (
            select *, rn = row_number() over (partition by convert(date, log_date) 
                                                  order by log_date desc)
            from   yourtable
       ) d
where  d.rn = 1
1 голос
/ 13 февраля 2020

Самый простой способ, которым я могу придумать, это сделать:

SELECT *
FROM Table 
WHERE log_date in (
    SELECT MAX(log_date)
    FROM Table 
    GROUP BY CONVERT(date,log_Date)
)

Но, возможно, это не совсем правильный способ сделать это.

0 голосов
/ 13 февраля 2020

Для таких сценариев ios вы должны использовать подзапросы. Давайте возьмем имя таблицы как YourTable.

Сначала вы должны получить самую последнюю дату каждого дня. Используйте ниже Query для этого.

SELECT MAX(log_date)
FROM YourTable
GROUP BY CONVERT(DATE,log_date)

Затем используйте нижеследующий запрос для окончательного результата, и вышеупомянутый запрос будет использоваться как подзапрос.

Окончательный запрос ниже.

SELECT * FROM YourTable WHERE log_date in ( SELECT MAX(log_date) FROM YourTable GROUP BY CONVERT(DATE,log_date) )

0 голосов
/ 13 февраля 2020

Самый простой способ , вероятно:

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. Однако необходимо сопоставить номер строки каждой строке, так что это немного больше работы, чем коррелированный подзапрос.

0 голосов
/ 13 февраля 2020
SELECT * 
FROM logdata 
WHERE log_date in (
    SELECT max(log_date)
    FROM logdata 
    GROUP BY CONVERT(date, log_date)
)
...