postgresql - postgres 工作日频率按小时

标签 postgresql

我想生成如下所示的报告(是 Google Analytics App for Android 的屏幕截图)

我有一天发生 10-15 次的事件,我希望看到每个工作日从头开始按小时分组的频率。

我只需要使用一个名为“created_at”的 DateTime(时间戳)字段(是一个 Rails 项目)

我如何在 PostgreSQL 中执行此操作?

谢谢

sample output

最佳答案

已经提供的答案都是正确的,但为了多样化这里使用了'tablefunc ' 对结果进行交叉制表的扩展,使其看起来与您的样本完全一致。

在使用它之前,您必须创建 tablefunc 扩展(在 postgresql 的 contrib 包中可用):

CREATE EXTENSION IF NOT EXISTS tablefunc;

这里是查询,假设输入数据在表 t 的列 created_at 中:

SELECT * FROM CROSSTAB($$SELECT h.hour AS hour_of_day,
    dow.day AS day, 
    COUNT(t.created_at)::INT
FROM (values('Mon'),('Tue'),('Wed'),('Thu'),('Fri'),('Sat'),('Sun')) AS dow(day)
CROSS JOIN generate_series(0,23) as h(hour)
LEFT JOIN t ON to_char(t.created_at, 'Dy')=dow.day AND extract(hour from t.created_at)=h.hour
GROUP BY dow.day,h.hour
ORDER BY h.hour,dow.day$$) AS d(Hour int, "Mon" int,"Tue" int,"Wed" int,"Thu" int,"Fri" int,"Sat" int,"Sun" int);

注意事项:

  • 查询将日期集与小时集 00-23 交叉连接,这样即使给定单元格的输入表中没有数据,输出中的所有单元格也都存在
  • 交叉表函数将 SQL 查询作为输入并对结果进行交叉制表,生成记录集
  • 由于我不完全清楚的原因,我不得不从计数中转换返回值(我猜它返回为 BIGINT?)
  • 您(不幸的是)必须通过 AS 子句拼出结果中的列名,如图所示

结果如下:

 hour | Mon | Tue | Wed | Thu | Fri | Sat | Sun
------+-----+-----+-----+-----+-----+-----+-----
    0 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    1 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    2 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    3 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    4 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    5 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    6 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    7 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    8 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    9 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   10 |   0 |   0 |   0 |   0 |   0 |   0 |   1
   11 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   12 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   13 |   0 |   0 |   0 |   1 |   0 |   0 |   0
   14 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   15 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   16 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   17 |   0 |   0 |   1 |   0 |   0 |   0 |   0
   18 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   19 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   20 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   21 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   22 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   23 |   0 |   0 |   0 |   0 |   1 |   0 |   0
(24 rows)

这是从这个示例数据生成的:

         created_at
----------------------------
 2014-06-12 23:06:03.746884
 2014-01-15 10:00:00
 2014-05-25 13:00:00
 2014-03-01 17:00:00
(4 rows)

关于postgresql - postgres 工作日频率按小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24184978/

相关文章:

postgresql - Postgres : left join with order by and limit 1

ruby-on-rails - 在本地主机上设置 Rails 项目,postgresql 问题

java - 从 Java 中的 jpa 注释更改表

json - 将转义引号插入 Postgres JSON 列

python - mock psycopg2 - 如何引发异常?

SQL 计算项目状态历史记录在日期范围内的项目项

sql - 在postgresql中的两个用户之间的对话中获取最新消息

C# Entity Framework Core 使用 native 枚举数据类型存储枚举

c++ - PostgreSQL不支持嵌套的BEGIN和END语句,即使它不支持自主事务?

java - 使用嵌入式 postgres 的测试因非法状态异常而失败