2016-11-11 38 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