我的桌子看起来像这样:
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
条目并保持最新。
答案 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)
这更多是评论,但我没有这样做的声誉,但是最好的做法是不要在选择语句中使用“ *”。在更复杂的表/视图中,它们会发生变化,如果您使用“ *”,那么选择的列会多于您原来想要的列,最终将遇到问题。