选择非标准化形式的mysql数据
如果这似乎是一个“愚蠢”的问题,请道歉——我真的不知道用什么词来描述我正在尝试做什么(因此,在这方面寻求帮助有点徒劳无功) 基本上,我最初的数据是:选择非标准化形式的mysql数据,mysql,normalization,Mysql,Normalization,如果这似乎是一个“愚蠢”的问题,请道歉——我真的不知道用什么词来描述我正在尝试做什么(因此,在这方面寻求帮助有点徒劳无功) 基本上,我最初的数据是: | timestamp | category A | category B | .......| category n| | 2011-12-02 00:05:00 | 23.63 | 27.00 | .......| 24.03 | | 2011-12-02 00:10:00 | 23.75
| timestamp | category A | category B | .......| category n|
| 2011-12-02 00:05:00 | 23.63 | 27.00 | .......| 24.03 |
| 2011-12-02 00:10:00 | 23.75 | 24.42 | .......| 24.45 |
| 2011-12-02 00:15:00 | 23.31 | 23.96 | .......| 26.54 |
我将这些数据放入一个数据库(并将其标准化),以便它在数据库中存在,如下所示:
+---------------------+--------------+-------+
| timestamp | catergory_id | value |
+---------------------+--------------+-------+
| 2011-12-02 00:05:00 | 2 | 27.00 |
| 2011-12-02 00:10:00 | 2 | 24.42 |
| 2011-12-02 00:15:00 | 2 | 23.96 |
| 2011-12-02 00:20:00 | 2 | 23.73 |
| 2011-12-02 00:25:00 | 2 | 23.73 |
+---------------------+--------------+-------+
我试图通过时间戳选择不同的类别(以便进行比较),如下所示:
+---------------------+-------+-------+
| timestamp | cat_a | cat_b |
+---------------------+-------+-------+
| 2011-12-02 00:05:00 | 23.63 | 27.00 |
| 2011-12-02 00:10:00 | 23.75 | 24.42 |
| 2011-12-02 00:15:00 | 23.31 | 23.96 |
| 2011-12-02 00:20:00 | 23.00 | 23.73 |
| 2011-12-02 00:25:00 | 22.91 | 23.73 |
+---------------------+-------+-------+
这基本上类似于原始数据结构(但我想在多个类别和可变类别之间进行选择/比较,而不仅仅是两个类别)
我已经能够使用join
(在各个表中选择了各个类别之后)来实现这一点。这对于跨两个类别进行比较是可以的,但似乎效率很低,特别是如果我想选择15或20个不同的类别进行比较。如果某个特定类别缺少一个数据点,这也是有问题的
(我做这件事的另一种方法是选择单独的表,然后将数据“合并”到python应用程序中,稍后在该应用程序中使用数据,但这似乎同样低效)
我觉得在mysql中必须有一种更简单或更直观的方法来实现这一点——我只是缺少了一些非常基本的东西。我真的不想去规范化(因为有很多类别,除了这个之外,将其规范化用于其他用途也是有意义的)
干杯,这基本上是一个数据透视表问题。MySQL没有内置的SQL扩展,无法像其他DBMS那样生成数据透视表,因此有点棘手。您可以在这里找到一种制作它们的方法:我使用python数据工具来解决这个问题。(这不适合那些对纯MySQL解决方案感兴趣的人——在这种情况下,请查看上面Joni的解决方案,或者查看一些类似的stackoverflow答案,例如or) 首先,我用我想要选择/比较的数据创建了熊猫数据框(使用
pandas.io
中的sql.read\u frame
方法以及相应的sql\u查询
):
这创建了一个数据帧,如下所示:
df.head():
然后使用pandas.pivot\u table
方法对其进行“透视”:
df2=df.pivot_table(rows='timestamp',cols='category_id',values='value')
它创建了我所追求的精确输出:
df2.head():
希望其他人觉得这个有用 对——“数据透视表”——这似乎是我遗漏的术语!快速搜索表明,这方面有相当多的资料。谢谢(也谢谢你的链接)
timestamp category_id value
0 2011-01-01 00:00:00 4 22.05
1 2011-01-01 00:05:00 4 24.10
2 2011-01-01 00:10:00 4 23.98
3 2011-01-01 00:15:00 4 24.10
4 2011-01-01 00:20:00 4 24.10
df2=df.pivot_table(rows='timestamp',cols='category_id',values='value')
category_id 2 4 5 6 7
timestamp
2011-01-01 00:00:00 23.43 22.05 25.07 19.47 21.32
2011-01-01 00:05:00 25.31 24.10 25.69 21.32 22.94
2011-01-01 00:10:00 25.31 23.98 24.84 21.32 22.59
2011-01-01 00:15:00 25.31 24.10 25.47 21.10 21.39
2011-01-01 00:20:00 25.31 24.10 25.69 20.01 17.9