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

时间:2012-12-17 00:18:07

标签: 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查询完成工作来跳过这一步。

2 个答案:

答案 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

请记住,ORDERSEQUENCE但不是所有)是保留关键字,必须进行转义。转义字符应取决于您使用的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
    );