显示最新不同数据的 SQL Server 查询

Posted

技术标签:

【中文标题】显示最新不同数据的 SQL Server 查询【英文标题】:SQL Server query showing most recent distinct data 【发布时间】:2020-08-19 00:19:43 【问题描述】:

我正在尝试构建一个 SQL 查询以仅恢复表中最年轻的记录(它已经有一个 Timestamp 列),其中我要过滤的项目出现多次,如我的表示例所示:

基本上,我有一个带有 Id、Millis、fkName 和 Price 的 table1,以及带有 Id 和名称的 table2

table1 中,同一个 fkName 可以多次出现。

我需要实现的是建立一个查询,我可以在其中列出每个 fkName 的最后一条记录,以便我可以获得每个项目的最实际价格。

到目前为止,我尝试使用

进行查询
SELECT DISTINCT [table1].[Millis], [table2].[Name], [table1].[Price]
FROM [table1]
JOIN [table2] ON [table2].[Id] = [table1].[fkName]
ORDER BY [table2].[Name]

但我没有得到正确的列表。

对此有何建议?提前致谢,

【问题讨论】:

轻松为您提供帮助:minimal reproducible example. 【参考方案1】:

使用公用表表达式:

;with [LastPrice] as (
    select [Millis], [Price], ROW_NUMBER() over (Partition by [fkName] order by [Millis] desc) rn
    from [table1] 
)
SELECT DISTINCT [LastPrice].[Millis],[table2].[Name],[LastPrice].[Price]
FROM [LastPrice]
JOIN [table2] ON [table2].[Id] = [LastPrice].[fkName]
WHERE [LastPrice].rn = 1
ORDER BY [table2].[Name]

【讨论】:

【参考方案2】:

解决这个每组最大 n 问题的一种简单且可移植的方法是使用子查询进行过滤:

select t1.millis, t2.name, t1.price
from table1 t1
inner join table2 t2 on t2.id = t1.fkName
where t1.millis = (select max(t11.millis) from table1 t11 where t11.fkName = t1.fkName)
order by t1.millis desc

【讨论】:

谢谢,GROUP BY 也可以用吗? @p.j.smith:不是真的。您需要整行,这意味着过滤,而不是聚合。

以上是关于显示最新不同数据的 SQL Server 查询的主要内容,如果未能解决你的问题,请参考以下文章

用于关联不同 SQL Server 表的选项 [重复]

C# 中不同数据库(如 Oracle 和 SQL Server)之间的 Sql 查询 [关闭]

SQL Server 中对大型数据集的慢速不同查询

SQL Server 不同数据间建立链接服务器进行连接查询

sql Server 查询方法的优化

Sql Server查询实战,实现不同班级的排行查询并且批量模拟数据进行查询测试