sql - 按小时间隔计数

标签 sql database postgresql

我在 postgresql 中编写了一个 SQL 查询,它运行良好,它让我得到每个员工每小时完成的工作量

SELECT COUNT(work_done) AS count, EXTRACT(hour from start_time) AS hour
FROM c_call
WHERE  start_time >= '2018-10-13 00:00:00'
GROUP BY employee_id;

如果某个员工每隔一个小时都处于事件状态,但当一个小时没有员工的数据时,它就会被忽略,这是完美的。如果员工在那个时间不工作,如何让它工作,以便结果包含每个时间间隔的一行,并且值字段设置为零。

最佳答案

您可以使用 generate_series 生成小时序列功能:

SELECT * FROM generate_series(0, 23) AS foo(bar)

然后用它来填补小时空缺:

WITH employee_call AS (
    SELECT 
        COUNT(work_done) AS count, 
        EXTRACT(hour from start_time) AS hour_fraction
    FROM 
        c_call
    WHERE  
        start_time >= '2018-10-13 00:00:00'
    GROUP BY 
        employee_id
), hour_series (hour_fraction) AS (
    SELECT generate_series(0, 23)
)
SELECT 
    COALESCE(c.count, 0) AS count, 
    COALESCE(c.hour_fraction, h.hour_fraction) AS hour_fraction 
FROM 
    hour_series h 
    LEFT JOIN employee_call c ON (c.hour_fraction = h.hour_fraction)

关于sql - 按小时间隔计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49410525/

相关文章:

mysql - 如果 SQL 查询没有找到结果,则返回默认值

python - 为python写入Redis中的几个数据库

java - Hibernate中Environment.DEFAULT_SCHEMA和数据库的区别

sql - 将列拆分为三列的新行

multithreading - 从 Postgres 函数中生成新进程

sql - Pivot 命令在多参数 CLR 聚合函数上失败...想法为什么?

php - Foreach 循环不根据列名回显正确的文本

sql - 在 WHERE IN() 或 SELECT 和 LEFT JOIN 上保持空关系

sql - 在 SQL Server 中连接 2 个数字

algorithm - PostgreSQL 中任意排序的性能如何?