【问题标题】:SQL: Get Frequency counter, similar to pivot tableSQL:获取频率计数器,类似于数据透视表
【发布时间】:2016-11-11 09:09:20
【问题描述】:

我在 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

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

【问题讨论】:

  • 您缺少序列/时间戳列
  • @DuduMarkovitz 你能详细说明一下吗?
  • 对不起,我的错......

标签: sql count pivot vertica


【解决方案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 旋转并填充频率间隙。 (如果你使用 pandas,旋转可能非常简单)。

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

from collections import defaultdict

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

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

希望对你有帮助。

【讨论】:

  • 这非常有帮助。非常感谢!
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 2018-02-09
  • 2016-04-10
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多