4

我正在尝试将下表转换为更容易查询的内容。历史数据很重要,因此它不能被丢弃,并且变量的选项数量不限(我只需要在最终结果中使用其中的一些)。

这几乎正​​是我需要做的,但它没有考虑历史数据,并假设变量对于 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

将上述转换为(确保使用最新的姓氏条目)

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

1 回答 1

3

获取每个用户的最新条目是greatest-n-per-groupStack Overflow 上经常标记的常见问题。我建议为此创建一个 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 回答