道歉,如果这似乎是一个“愚蠢”的问题 - 我真的不知道正确的术语来描述我想要做的事情(因此寻求帮助就没有用了)。
基本上,我最初的数据形式为:
| 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中必须有一种更简单或更直观的方法来做这件事 - 我只是缺少一些非常基本的东西。我真的不想去标准化(因为有很多类别,除了这个之外,将其标准化用于其他用途是有意义的。)
干杯,
答案 0 :(得分:0)
这基本上是一个数据透视表问题。 MySQL没有内置的SQL扩展来像其他DBMS一样制作数据透视表这样做有点棘手。你可以在这里找到一种方法:http://www.artfulsoftware.com/infotree/qrytip.php?id=78
答案 1 :(得分:0)
我对此问题的解决方案使用了python数据工具pandas。 (这不适合那些对纯MySQL解决方案感兴趣的人 - 对于这种情况,请查看上面的Joni解决方案,或者查看一些类似的stackoverflow答案,例如mysql pivot query results with GROUP BY或MySQL pivot table query with dynamic columns。 / p>
首先,我创建了一个pandas数据框,其中包含我想要选择/比较的数据(使用sql.read_frame
中的pandas.io
方法和相应的sql_query
):
df=sql.read_frame(sql_query,DB_connection)
这样就创建了一个数据框:
df.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
然后使用pandas.pivot_table
方法“旋转”:
df2=df.pivot_table(rows='timestamp',cols='category_id',values='value')
创建我之后的确切输出:
df2.head():
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
希望别人觉得这很有用!