如何从SQL Server 2014数据库的表中查询每天最后插入的一条数据呢?
如题,如何从SQL Server 2014数据库的表中查询每天最后插入的一条数据呢?假如表的字段有:Id
,Name
,CreatedTime
。
数据表结构及示例数据如下:
CREATE TABLE MyTable (
Id INT PRIMARY KEY IDENTITY(1,1),
Name VARCHAR(50),
CreatedTime DATETIME
);
INSERT INTO MyTable (Name, CreatedTime) VALUES ('John', '2022-02-21 08:00:00');
INSERT INTO MyTable (Name, CreatedTime) VALUES ('Alice', '2022-02-21 09:00:00');
INSERT INTO MyTable (Name, CreatedTime) VALUES ('Bob', '2022-02-21 10:00:00');
INSERT INTO MyTable (Name, CreatedTime) VALUES ('Tom', '2022-02-22 08:00:00');
INSERT INTO MyTable (Name, CreatedTime) VALUES ('Jane', '2022-02-22 09:00:00');
INSERT INTO MyTable (Name, CreatedTime) VALUES ('Lily', '2022-02-22 10:00:00');
2 个回答
-
可以使用窗口函数来实现从
MyTable
中查询每天最后插入的一条数据。以下是使用窗口函数的示例代码:
解释一下上面的代码:
首先,我们使用CTE(Common Table Expression)子句创建一个临时的查询结果集,命名为
CTE
。在
CTE
中,我们使用窗口函数ROW_NUMBER()
来对每个日期(即Convert(date, CreatedTime)
)内的数据进行编号,按照CreatedTime
的降序排序,这样每个日期内的编号1
即为最后插入的数据。最后,我们在
CTE
中筛选出RowNum
为1
的数据,即每个日期内最后插入的一条数据,输出它们的Id
、Name
和CreatedTime
。需要注意的是,这种写法在
MyTable
比较大时可能会影响性能,因为它会将整个表中的数据进行排序,而不是只处理每个日期的最后一条数据。因此,建议在MyTable
中添加一个索引,包括CreatedTime
和其它常用查询条件的列,以提高查询效率。 -
以下是使用
CROSS APPLY
的方式实现查询MyTable
表中每天最后插入的一条数据的SQL语句,并输出查询结果:这个查询与前面提到的
ROW_NUMBER()
方式不同之处在于,它使用CROSS APPLY
子查询来筛选出每天最后插入的一条数据,而不需要进行排序。具体来说,子查询使用了
TOP 1
来选择每天最后插入的一条数据,并按照CreatedTime
和Id
两个字段进行倒序排序。在CROSS APPLY
的帮助下,这个子查询将被应用到主查询的每一行数据上,从而得到了每天最后插入的一条数据的信息。输出结果如下:
Id Name CreatedTime 3 Bob 2022-02-21 10:00:00.000 6 Lily 2022-02-22 10:00:00.000