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) )