sql - 使用ROW_NUMBER函数删除/省略查询结果中的列

时间:2018-05-14 08:44:40

标签: sql sql-server

我有几个唯一ID,这些唯一ID具有基于

的重复数据
  

时间戳

我按以下方式为每个唯一ID获取timestamp的最新数据:

SELECT * 
FROM (SELECT uniqueID, timestamp
                      ROW_NUMBER() OVER(PARTITION BY uniqueID ORDER BY timestamp DESC) rn 
      FROM table_name
     ) a 
WHERE rn = 1

这样可行,但查询也会返回一个列。所以我的结果集如下所示:

uniqueID timestamp rn
1        15:00     1
2        15:00     1

如何从查询结果中省略列rn?使它看起来像这样:

uniqueID timestamp
1        15:00
2        15:00

参考:http://www.postgresqltutorial.com/postgresql-row_number/

2 个答案:

答案 0 :(得分:2)

您可以像下面这样更改您的查询。您无需提交*,只需提及您需要的列。

SELECT a.uniqueid , 
       a.timestamp 
FROM   ( 
        SELECT   uniqueid, 
                    timestamp, row_number() OVER(partition BY uniqueid ORDER BY timestamp DESC) rn
        FROM     table_name) a 
WHERE  rn = 1

答案 1 :(得分:0)

如果你有很多专栏,你可能会觉得做起来更简单:

SELECT a.*
FROM table_name a 
WHERE a.timestamp = (SELECT MAX(a2.timestamp) FROM table_name a2 WHERE a2.uniqueid = a.uniqueid);

此外,如果您在(uniqueid, timestamp)上有索引,这可能会稍微提高一点。

具有讽刺意味的是,Postgres有一个更简单的解决方案(你指的是Postgres教程):

select distinct on (uniqueid) a.*
from table_name a
order by uniqueid, timestamp desc;