sql: 按不同部分计算 um_no 的数量,按小时累计

标签 sql postgresql

无特定函数如何按不同段数和按小时累计多少um_no

原创:

+-------+------+------+-----+
| um_no | nums | hour | day |
+-------+------+------+-----+
| mary  |    3 |    8 |   1 |
| john  |    6 |    8 |   1 |
| peter |    2 |    8 |   1 |
| jason |    1 |    8 |   1 |
| mary  |    5 |    9 |   1 |
| john  |    6 |    9 |   1 |
| peter |    6 |    9 |   1 |
| jason |    1 |    9 |   1 |
| mary  |    5 |   10 |   1 |
| john  |    4 |   10 |   1 |
| peter |    2 |   10 |   1 |
| jason |    4 |   10 |   1 |
+-------+------+------+-----+

想要:

+-----+------+---------+----------+-----------+----------+
| day | hour | nums0_5 | nums5_10 | nums10_15 | nums15up |
+-----+------+---------+----------+-----------+----------+
|   1 |    8 |       3 |        1 |         0 |        0 |
|   1 |    9 |       1 |        2 |         1 |        0 |
|   1 |   10 |       0 |        2 |         1 |        1 |
+-----+------+---------+----------+-----------+----------+

最佳答案

你可以尝试.. 与 gordon 的建议一起使用,这真的很棒..

select
  day,
  hour,
  count(*) filter (where sum_nums >= 0 and sum_nums <= 5) as nums0_5,
  count(*) filter (where sum_nums >= 5 and sum_nums <= 10) as nums5_10,
  count(*) filter (where sum_nums >= 10 and sum_nums <= 15) as nums10_15,
  count(*) filter (where sum_nums >= 15) as nums15up
from
  (select 
      *,
      sum(nums) over (partition by um_no, day order by hour) as sum_nums
   from 
      tbl) t
group by
  day,
  hour

你可以在这里看到 DEMO

关于sql: 按不同部分计算 um_no 的数量,按小时累计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53423613/

相关文章:

mysql - 如何只消除连续重复而不是选择查询(MySQL)中的所有重复?

java - 仅允许通过 sql server 、 oracle 和 postgres 中的 jdbc 对表进行更新

postgresql - 在这种情况下,为什么 Postgresql 不对我的复合索引使用 Index Only Scan?

SQL Group by "Like"

mysql - 优化具有时区转换和按小时分组的Mysql查询

SQL为具有相同ID的所有日期添加摘要行

sql - INSERT INTO ... RETURNING 多列 (PostgreSQL)

database - Postgres 中的 UUID 主键,什么插入性能影响?

sql - 了解 postgreSQL 共享内存

php - 转换时间格式为 HH :MM AM/PM to HH:MM:SS