2016-11-11 29 views
1

我已在Vertica的数据库SQL:获取频率计数器,类似透视表

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

下表我试图让每个事件的频率,每读出。也许我missusing在这种情况下,术语“频率”,但最好在最后我会像这样的表:

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

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

# 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是,我需要提前知道的事件,需要一个单独的查询的名字,我必须跑一堆循环。 有没有更好的方法来做到这一点。 Thanks Mates

+0

你错过了一个序列/时间戳列 –

+0

@DuduMarkovitz你能否详细说明一下? – valenzio

+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 

然后用蟒蛇绕轴转动,填补了频率空隙,如果您需要。 (如果你使用熊猫,pivoting可能很简单)。

下面是一个例子旋转到字典(取决于哪个LIB您使用和设置您的连接,所以你可能需要去改变它):

from collections import defaultdict 

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

我敢肯定有一些更聪明的方式来与词典理解,但这似乎很简单。

希望它有帮助。

+0

这非常有帮助。非常感谢你! – valenzio