3

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

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

2 回答 2

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( also SEQUENCEbut not all ) 是保留关键字,必须转义。转义字符应取决于您使用的 RDBMS。

于 2012-12-17T00:22:14.503 回答
0

SQL 模式:finding_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
    );
于 2012-12-17T00:48:35.513 回答