以非规范化形式选择mysql数据

时间:2013-07-26 05:59:31

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

干杯,

2 个答案:

答案 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 BYMySQL 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

希望别人觉得这很有用!