我有一个SQL Server表,其格式为:
Timestamp Name Price
2018-01-02 Name1 0.10
2018-01-03 Name1 0.20
2018-01-04 Name1 0.30
2018-01-02 Name2 0.40
2018-01-03 Name2 0.50
2018-01-04 Name2 0.60
2018-01-02 Name3 0.70
2018-01-03 Name3 0.80
2018-01-05 Name3 0.90
我正在尝试编写一个选择查询,为每个唯一Timestamp
返回最新(按Name
)。因此,对于上面的数据示例,查询应该返回:
Timestamp Name Price
2018-01-04 Name1 0.30
2018-01-04 Name2 0.60
2018-01-05 Name3 0.90
我怀疑查询是这样的:
SELECT TOP 1 * FROM mytable ORDER BY Timestamp DESC GROUP BY Name
但是,这有语法错误。
有谁知道这样的查询是否可行? 如何获取每个唯一Timestamp
的最新行(Name
)?
如果重要的话,我正在使用Microsoft Azure SQL。
答案 0 :(得分:1)
尝试row_number()
:
select t.*
from (select t.*,
row_number() over (partition by name order by timestamp desc) as seqnum
from mytable t
) t
where seqnum = 1;
答案 1 :(得分:1)
在Sql中,ORDER BY总是在GROUP BY之后
此外,带有GROUP BY的SELECT *
对大多数数据库都不起作用。
但在MS SQL Server中,您可以将TOP与TIES&按行ROW_NUMBER。
SELECT TOP 1 WITH TIES *
FROM mytable
ORDER BY ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Timestamp DESC)
如果结果也需要按PARTITION中使用的字段排序,那么只需输入一个子查询。
SELECT *
FROM (
SELECT TOP 1 WITH TIES *
FROM mytable
ORDER BY ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Timestamp DESC)
) q
ORDER BY Name
答案 2 :(得分:0)
另一种方法是使用CTE查找时间戳/名称对,然后联接回基表以投影价格列:
WITH CandidateRows ([Timestamp],[Name])
AS
(
Select MAX([Timestamp]), [Name] From TestTable GROUP BY [Name]
)
SELECT T1.[Timestamp], T1.[Name], T2.[Price]
FROM CandidateRows T1 JOIN TestTable T2
ON T1.[Timestamp] = T2.[Timestamp] AND T1.[Name] = T2.[Name]
ORDER BY T1.[Name] ASC
答案 3 :(得分:0)
您也可以在此处使用subquery
:
select *
from table t
where timestamp = (select max(timestamp) from table where name = t.name);
注意:同名日期相同时要小心