我在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
答案 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理解来做到这一点,但这似乎很简单。
希望它有所帮助。