考虑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,但我不能破解这个.
最佳答案 您可以为每个列使用CASE语句为匹配生成1,然后将所有行按SUM,类似于;
SELECT date_trunc('day', timestamp) AS time,
SUM(CASE WHEN "eventName" = 'AAA' THEN 1 ELSE 0 END) AAA,
SUM(CASE WHEN "eventName" = 'BBB' THEN 1 ELSE 0 END) BBB,
SUM(CASE WHEN "eventName" = 'CCC' THEN 1 ELSE 0 END) CCC
FROM sidetrack
GROUP BY date_trunc('day', timestamp)
ORDER BY date_trunc('day', timestamp) ASC