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']
我确信有一些更聪明的方法可以通过听写理解来做到这一点,但这看起来很简单。
希望对您有所帮助。
我在 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']
我确信有一些更聪明的方法可以通过听写理解来做到这一点,但这看起来很简单。
希望对您有所帮助。