0

次の構造のテーブルがあります。

ID  KEY     VALUE   SEQ
1   Amount  5       2   
1   Amount  4       1
1   Type    T1      2   
1   Type    T1      1
2   Amount  10      2   
2   Amount  5       1
2   Type    T2      2
2   Type    T2      1

これを取得するクエリを作成したいと思います。

ID  Amount  Type
1   5       T1
2   10      T2

ご覧のとおり、(ID, Key) の複数の組み合わせが存在する可能性がありますが、(ID, Key, Seq) は一意です。

SELECT  T.ID, 
        T1.VALUE as Amount, 
        T2.VALUE as Type
FROM 
    (SELECT ID, MAX(SEQ) as MAXSEQ FROM TABLE GROUP BY ID) as T
    JOIN
        TABLE as T1
            ON T1.ID = T.ID
            AND T1.KEY = 'Amount'
            AND T1.SEQ = MAXSEQ
    JOIN
        TABLE as T2
            ON T2.ID = T.ID
            AND T2.KEY = 'Type'
            AND T2.SEQ = MAXSEQ

しかし、私は期待していなかった結果を得ています

ID  Amount  Type

    1   5       T1
    1   4       T1
    1   10      T1
    1   5       T1
    2   10      T2
    2   5       T2
    2   4       T2
    2   5       T2

私はすでにこの投稿を読みましたが、ここでは役立ちますが、私のケースには当てはまりません

誰がこれを修正するかについて何か考えはありますか?

4

3 に答える 3

0

結果に影響を与えていた別の列があり、(実際のデータを提供するのを避けるために) 質問に入れなかったことに気付きました。一意の制約は、(ID, Key, Seq) ではなく (ID, Key, Seq, Time) でした。@Andrewが言及したように、クエリは正しい結果を返しています。

ここで再びクエリが実行されます

SELECT  T.ID, 
        T1.VALUE as Amount, 
        T2.VALUE as Type
FROM 
    (SELECT ID, MAX(SEQ) as MAXSEQ FROM TABLE GROUP BY ID) as T
    JOIN
        TABLE as T1
            ON T1.ID = T.ID
            AND T1.KEY = 'Amount'
            AND T1.SEQ = MAXSEQ
    JOIN
        TABLE as T2
            ON T2.ID = T.ID
            AND T2.KEY = 'Type'
            AND T2.SEQ = MAXSEQ

説明と sqlfiddle について Andrew に感謝します。誰かの時間を無駄にしてしまったら申し訳ありません。

于 2013-10-30T15:34:18.630 に答える
0

リンクされた質問に欠けているのはDISTINCTキーワードです。

ypercube によって投稿されたクエリの下の説明も参照してください。実際、テーブル自体を結合しているため、重複が発生しています。したがって、行はミラーリングされます。

サブクエリは次のようになります。

(SELECT DISTINCT ID, MAX(SEQ) as MAXSEQ FROM TABLE GROUP BY ID) as T
于 2013-10-29T21:24:48.573 に答える