SQL:获取频率计数器,类似于pivot table

SQL: Get Frequency counter, similar to pivot table

我在 Vertica 数据库中有以下 Table

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

我正在尝试获取每次读出的每个事件的频率。也许我在这种情况下误用了 'frequency' 一词,但理想情况下,最后我会得到这样的 table :

+-----------+---------+---------+--+
| 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

但缺点是我需要提前知道事件的名称,这需要单独查询并且我必须 运行 一堆循环。 有没有更优雅的方法来做到这一点。 谢谢队友

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 调整并在需要时填补频率差距。 (如果您使用 pandas,旋转可能非常简单)。

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

from collections import defaultdict

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

我确信有一些更聪明的方法可以通过听写理解来做到这一点,但这看起来很简单。

希望对您有所帮助。