SQL 服务器查询显示最近的不同数据
SQL Server query showing most recent distinct data
我正在尝试构建一个 SQL 查询以仅恢复 table 的最新记录(它已经有一个时间戳列),其中我要过滤的项目出现了几个次,如我的 table 示例所示:
。
基本上,我有一个带有 Id、Millis、fkName 和价格的 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]
但我没有得到正确的列表。
对此有何建议?提前致谢,
解决每组最大 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
使用通用 Table 表达式:
;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]
我正在尝试构建一个 SQL 查询以仅恢复 table 的最新记录(它已经有一个时间戳列),其中我要过滤的项目出现了几个次,如我的 table 示例所示:
基本上,我有一个带有 Id、Millis、fkName 和价格的 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]
但我没有得到正确的列表。
对此有何建议?提前致谢,
解决每组最大 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
使用通用 Table 表达式:
;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]