sql - 如何根据排名值从表中选择行

标签 sql select

我有一个具有以下(简化)结构的表:

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/

相关文章:

sql - 如何从表中的 oracle sql 中选择带有 group by 子句的嵌套 json 对象?

c# - 将多列更新为一列作为字符串

mysql - 如何使用 MySQL 字符串函数在单词中插入空格?

R - 选择最后两列

c# - 为什么数据库会超时?

mysql - 如何加入同一列两次?

SQL 日期如果为 Null 则返回空白

mysql - 选择具有多个条件的多列

sql-server - 从存储过程的结果集中选择列

jquery - 选择连接 : if selected option have value 1, 显示另一个选择