选择非标准化形式的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