查询特定列中不重复的,保留最近的

Query without duplicates in a specific column, leaving the most recent

我的 table 看起来像这样:

 status_id  |  user_id    |    updated_on
 -----------+-------------+---------------------
 0001       |   0004      | 2018-02-03 14:43:48
 0002       |   0004      | 2018-02-03 10:07:33
 0003       |   0005      | 2018-02-02 09:38:21
 0003       |   0005      | 2018-02-02 09:38:21

我是 运行 一个简单的查询,用于获取 user_ids 列表的所有行:

SELECT * FROM user.status
WHERE user_id IN ('0004','0005');

我正在寻找一种方法来获得相同的结果,但没有任何重复的 user_id 条目并保留最新的条目。

您可以使用相关子查询:

SELECT s.*
FROM user.status s
WHERE s.order_id IN ('0004','0005') AND
      s.updated_on = (SELECT MAX(s2.updated_on)
                      FROM user.status s2
                      WHERE s2.order_id = s.order_id
                     );

Teradata 中还有其他方法。 QUALIFY 子句就是其中之一:

SELECT s.*
FROM user.status s
WHERE s.order_id IN ('0004','0005') 
QUALIFY ROW_NUMBER() OVER (PARTITION BY s.order_id ORDER BY s.updated_on DESC) = 1;

我很想知道在您的情况下哪个性能更好。

这更像是评论,但我没有这样做的名声,但最好不要在 select 语句中使用“*”。在更复杂的 tables/views 中,它们会发生变化,如果您使用“ * ”,您最终会 运行 遇到问题,因为 select 的列比您最初想要的多。