我有一个包含以下(简化)结构的表:
Order, Status, Sequence
1000, New, 0
1000, Viewed, 1
1000, Shipped, 2
1001, New, 0
1002, New, 0
1002, Viewed, 1
1002, New, 2
我想要一个SELECT语句,它将返回每个订单的最大序列号的行。因此,在上面的示例中,我希望结果数据集为:
1000, Shipped, 2
1001, New, 0
1002, New, 2
有一种简单的方法吗?我似乎无法构造一个可以做到的WHERE表达式。
回复一些评论:
答案 0 :(得分:2)
由于您尚未提及您的RDBMS,您可以在下面尝试此查询,
SELECT a.*
FROM tableName a
INNER JOIN
(
SELECT Order, MAX(Sequence) maxValue
FROM tableName
GROUP BY Order
) b ON a.Order = b.Order AND
a.Sequence = b.maxValue
这适用于大多数RDBMS。
如果您的RDBMS支持Window Function
,您可以这样做,
SELECT Order, Status, Sequence
FROM
(
SELECT Order, Status, Sequence,
ROW_NUMBER() OVER (PARTITION BY Order
ORDER BY Sequence DESC)
FROM TableName
) derivedTable
请记住,ORDER
(也SEQUENCE
但不是所有)是保留关键字,必须进行转义。转义字符应取决于您使用的RDBMS。
答案 1 :(得分:0)
SQL模式:finds_the_max总是可以用NOT EXISTS表示更大的:
SELECT *
FROM ztable zt
WHERE NOT EXISTS (
SELECT *
FROM ztable nx
WHERE nx.zorder = zt.zorder
AND nx.zsequence > zt.zsequence
);