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すべてではありませんがSEQUENCE予約済みのキーワードであり、エスケープする必要があることに注意してください。エスケープ文字は、使用している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 に答える