Select 仅按日期显示最新的日期时间条目
Select only latest datetime entry by date
我有一个 table 的日志数据(数据库是 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 是日期时间。
我只想获取 table 中每个日期的最后记录时间。结果应该是:
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
提前致谢。
奥格·斯万霍姆
SELECT *
FROM logdata
WHERE log_date in (
SELECT max(log_date)
FROM logdata
GROUP BY CONVERT(date, log_date)
)
使用 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
我能想到的最简单的方法是:
SELECT *
FROM Table
WHERE log_date in (
SELECT MAX(log_date)
FROM Table
GROUP BY CONVERT(date,log_Date)
)
但这也许不是正确的方法。
最简单的方法大概是:
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()
是 "canonical" 方法,完全受标准 SQL 支持。但是,它需要将行号映射回每一行,因此这比相关子查询要多一些工作。
对于这些场景,您必须使用子查询。
让我们将 table 名称作为 YourTable。
首先,您应该获取每天的最新日期。为此使用下面的查询。
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)
)
我有一个 table 的日志数据(数据库是 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 是日期时间。
我只想获取 table 中每个日期的最后记录时间。结果应该是:
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
提前致谢。
奥格·斯万霍姆
SELECT *
FROM logdata
WHERE log_date in (
SELECT max(log_date)
FROM logdata
GROUP BY CONVERT(date, log_date)
)
使用 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
我能想到的最简单的方法是:
SELECT *
FROM Table
WHERE log_date in (
SELECT MAX(log_date)
FROM Table
GROUP BY CONVERT(date,log_Date)
)
但这也许不是正确的方法。
最简单的方法大概是:
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()
是 "canonical" 方法,完全受标准 SQL 支持。但是,它需要将行号映射回每一行,因此这比相关子查询要多一些工作。
对于这些场景,您必须使用子查询。 让我们将 table 名称作为 YourTable。
首先,您应该获取每天的最新日期。为此使用下面的查询。
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)
)