4

次のテーブルを、クエリが少し簡単なものに変換しようとしています。履歴データは重要であるため、破棄することはできず、Variable には無数のオプションがあります (最終結果で必要なのはそれらの一部だけです)。

これは私がする必要があることとほぼ同じですが、履歴データを考慮しておらず、変数が User_ID に固有であると想定しています。私の場合、user_ID には同じ変数が 3 つまたは 4 つある可能性があり、最新のものが必要です。参照 > MySQL ピボット テーブル

| UUID   |UUID_User |Variable  |Value     |DateSet              |
|--------|----------|----------|----------|---------------------|
| X123Y  |123XX12   |FirstName |Jane      | 2011-07-09 14:13:12 |
| X126Y  |123XX12   |LastName  |Jones     | 2011-07-09 14:13:12 |
| X173Y  |123XX62   |FirstName |Joe       | 2011-07-09 14:11:12 |
| X143Y  |123XX62   |LastName  |Smith     | 2011-07-09 14:11:12 |
| X129Y  |123XX12   |LastName  |Smith     | 2011-11-09 14:13:12 | << Jane Gets Married

上記を次のように変換します (jane の最新の姓エントリを使用するようにしてください)。

|UUID_User |FirstName |LastName  |
|----------|----------|----------|
|123XX12   |Jane      |Smith     |
|123XX62   |John      |Smith     |
4

1 に答える 1

3

ユーザーごとに最新のエントリを取得することは、StackOverflowでタグ付けされることが多い一般的な問題ですgreatest-n-per-group。厳密には必要ではありませんが、このためのVIEWを作成することをお勧めします。

CREATE VIEW LatestKeyValue AS
 SELECT k1.*
 FROM KeyValue AS k1
 LEFT OUTER JOIN KeyValue AS k2
  ON (k1.UUID_User, k1.Variable) = (k2.UUID_User, k2.Variable) 
  AND k1.DateSet < k2.DateSet
 WHERE k2.DateSet IS NULL

次に、次のようないくつかの異なる方法で、必要な変数ごとにそれをピボットできます。

SELECT UUID_User, 
  MAX(CASE Variable WHEN 'FirstName' THEN Value END) AS FirstName,
  MAX(CASE Variable WHEN 'LastName' THEN Value END) AS LastName
FROM LatestKeyValue
GROUP BY UUID_User
于 2011-12-06T19:17:04.697 に答える