我有一个具有以下(简化)结构的表:
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 表达式。
回应一些评论:
- 有几个正在使用的 DMBS 出现了这个问题:MS-SQL、MySQL、Oracle 和 Access。
- 涉及到如此多的 DMBS,因为正在开发的系统正在整合来自组织中其他数据库的数据。出于这个原因,我无法控制作为保留字的列名称,但我知道需要对名称进行转义。
- 尝试了子查询、GROUP BY、DISTINCT、MAX 和 COUNT 的多种组合,但都没有成功。由于查询结果总是在 Excel 中结束,我一直在抓取所有行并在 Excel 中排序和删除重复项。我的偏好是通过让 SQL 查询完成工作来跳过此步骤。
最佳答案
因为你没有提到你的 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。
关于sql - 如何根据排名值从表中选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13906849/