如何查询SQL中字段分区的单个记录?

时间:2018-04-27 20:14:49

标签: sql azure-sql-database

我有一个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。

4 个答案:

答案 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);

注意:同名日期相同时要小心