【发布时间】:2015-12-19 22:50:58
【问题描述】:
考虑 PostgreSQL 9.4 中的以下事件数据:
eventTime | eventName
2015-09-25 18:00:00 | 'AAA'
2015-09-25 17:00:00 | 'BBB'
2015-09-25 16:00:00 | 'BBB'
2015-09-25 15:00:00 | 'BBB'
2015-09-25 14:00:00 | 'AAA'
2015-09-26 13:00:00 | 'CCC'
2015-09-26 12:00:00 | 'AAA'
2015-09-26 11:00:00 | 'BBB'
2015-09-26 10:00:00 | 'CCC'
2015-09-26 09:00:00 | 'BBB'
2015-09-27 08:00:00 | 'AAA'
2015-09-27 07:00:00 | 'CCC'
2015-09-27 05:00:00 | 'CCC'
2015-09-27 04:00:00 | 'CCC'
2015-09-27 03:00:00 | 'CCC'
2015-09-27 02:00:00 | 'AAA'
虽然单个基于 count() 的表很简单,例如:
SELECT eventTime, count(1)
from (SELECT data->>'eventName' as eventName,
date_trunc('day', to_timestamp(data->>'timestamp','YYYY-MM-DDZHH24:MI:SS.MS')::timestamp without time zone) AS eventTime
FROM sidetrack where (data->>'eventName' = 'AAA') IS TRUE) AS tmptab
GROUP BY eventTime
ORDER BY eventTime ASC
只能计算单个值eventName 的出现次数。我对 SQL 不是很有经验,并且正在努力寻找一种方法来创建双向频率表。在此示例中,结果将是:
day | 'AAA' | 'BBB' | 'CCC'
------------+-------+-------+-------
2015-09-25 | 2 | 3 | 0
2015-09-26 | 1 | 2 | 2
2015-09-27 | 2 | 0 | 4
有些例子是计算带有数值的变量
使用with_bucket(),但这并不能推广到字符串值字段。
我试过WITH下的嵌套选择,比如:
WITH
foo AS (
SELECT ...
),
bar AS (
SELECT ...
FROM foo
),
SELECT *
FROM bar;
还有外部 JOINS,但我无法破解这个。
【问题讨论】:
-
您的查询从 JSON 值中提取,但您的问题甚至没有提到 JSON。请澄清并提供实际的表定义,并一如既往地提供您的 Postgres 版本。
-
您好 Erwin,您是正确的,从 JSON 键中提取文本这一事实与频率表挑战无关。我正在使用没有 JSON 的测试表进行原型设计。我使用带有 JSON 的片段作为工作示例。 Postgres 的版本是 9.4。谢谢。
标签: sql postgresql frequency-analysis two-way