0

如果这似乎是一个“愚蠢”的问题,我深表歉意——我真的不知道描述我正在尝试做的事情的正确术语(因此寻求帮助有点徒劳)。

基本上,我最初有以下形式的数据:

|      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 中必须有一种更简单或更直观的方法来执行此操作-我只是缺少一些非常基本的东西。我真的不想去规范化(因为有很多类别,除了这个之外,将其规范化以用于其他用途是有意义的)。

干杯,

4

2 回答 2

0

这基本上是一个数据透视表问题。MySQL 没有内置的 SQL 扩展来像其他一些 DBMS 那样制作数据透视表,所以它们有点棘手。您可以在这里找到一种制作方法:http ://www.artfulsoftware.com/infotree/qrytip.php?id=78

于 2013-07-26T06:13:51.547 回答
0

我对这个问题的解决方案使用了 python 数据工具pandas。(这不适合那些对纯 MySQL 解决方案感兴趣的人 - 对于这种情况,请查看上面 Joni 的解决方案,或查看一些类似的 stackoverflow 答案,例如使用 GROUP BY 的 mysql 透视查询结果使用动态的 MySQL 透视表查询列)。

首先,我使用要选择/比较的数据创建了一个 pandas 数据框(使用sql.read_framefrompandas.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

希望其他人觉得这很有用!

于 2013-07-27T12:20:45.033 回答