查询在特定列中没有重复项,保留最新的

时间:2018-08-22 14:22:34

标签: sql teradata

我的桌子看起来像这样:

 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_id列表的所有行:

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用相关子查询:

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;

我想知道哪种方法在您的情况下表现更好。

答案 1 :(得分:0)

这更多是评论,但我没有这样做的声誉,但是最好的做法是不要在选择语句中使用“ *”。在更复杂的表/视图中,它们会发生变化,如果您使用“ *”,那么选择的列会多于您原来想要的列,最终将遇到问题。