SQL:获取频率计数器,类似于数据透视表

时间:2016-11-11 09:09:20

标签: sql count pivot vertica

我在Vertica数据库中有以下表格

+---------+-------+
| ReadOut | Event |
+---------+-------+
|       1 | A     |
|       1 | A     |
|       1 | B     |
|       1 | B     |
|       2 | A     |
|       2 | B     |
|       2 | B     |
+---------+-------+

我试图获取每次读出的每个事件的频率。也许我错过了术语“频率”这个词。在这种情况下,但理想情况下,我会有一个这样的表:

+-----------+---------+---------+--+
| Frequency | Event_A | Event_B |  |
+-----------+---------+---------+--+
| 1         |       1 |       0 |  |
| 2         |       1 |       2 |  |
| 3         |       0 |       0 |  |
| 4         |       0 |       0 |  |
| .         |       0 |       0 |  |
| .         |       0 |       0 |  |
| .         |       0 |       0 |  |
+-----------+---------+---------+--+

到目前为止,我在python中实现了一个看起来像这样的for循环(简化版):

# get all the available event names
Eventlist=SELECT DISTINCT Event FROM table
# loop over each event to get the frequency
for ii in Eventlist:
    SELECT count(Readout) FROM table WHERE Event = ii group by Readout

但是,disadvante是我需要提前知道事件的名称,这需要一个单独的查询,我必须运行一堆循环。 有没有更优雅的方式这样做。 谢谢Mates

1 个答案:

答案 0 :(得分:1)

Vertica没有透视功能。你需要生成sql来转移或只是在python中转动。我会在python中完成它,让你的查询简单。

至于获取每个事件的计数,您可以一次完成所有操作:

with f as (
    SELECT readout, event, COUNT(*) frequency
    FROM   mytable
    GROUP BY 1, 2 
)
select frequency, event, count(*) cnt
from f
group by 1, 2
order by 1, 2

然后使用python旋转并填写频率间隙(如果需要)。 (如果你使用熊猫,旋转可能很简单)。

这是一个转向dict的示例(取决于您使用的lib和连接的设置,因此您可能需要更改它):

from collections import defaultdict

myresult = defaultdict(dict)
for row in rows: 
    myresult[row['frequency'][row['event']] = row['cnt']

我确信有一些更聪明的方法可以用dict理解来做到这一点,但这似乎很简单。

希望它有所帮助。