一尘不染

PostgreSQL如何获取某些行的总和

sql

如果标题不太恰当,我深表歉意,但是在编写简洁的标题时遇到了一些麻烦。无论如何,我有一个表可以记录一个人所处的状态。它看起来像:

id, login, state, duration, started_at
1, pdiddy, working, 1200, 2018-05-25 08:30:00
2, pdiddy, lunch, 120, 2018-05-25 9:00:00
3, pdiddy, on_call, 65, 2018-05-25 12:30:00
4, pdiddy, available, 1115, 2018-05-25 12:30:00
5, pdiddy, working, 143, 2018-05-25 12:30:00
6, pdiddy, break1, 150, 2018-05-25 12:30:00
7, pdiddy, working, 2400, 2018-05-25 12:30:00
8, pdiddy, break2, 110, 2018-05-25 12:30:00

我只需要每天为每个用户获取与人工相关的工期的平均值。因此,基本上,我需要在任何给定的一天累加除“午餐”,“ break1”和“
break2”以外的所有内容的持续时间,并获取其平均值。

我试图这样做,但是这样做的问题是,在求平均值之前,它不会将与人工相关的日志相加。我不知道该怎么做。

SELECT
    log.login,
    AVG(log.duration) FILTER (WHERE log.state NOT IN ('lunch', 'break1', 'break2')) AS "labor_average"
FROM
    log
GROUP BY 1

显然,我不希望任何人为我做这件事。我只需要指出正确的方向。我显然可以从解决方案中找到很多方法,所以我只需要朝正确的方向推进即可。提前非常感谢您!


阅读 234

收藏
2021-05-23

共1个答案

一尘不染

我认为您希望将总数除以天数:

SELECT l.login,
       (SUM(l.duration) FILTER (WHERE l.state NOT IN ('lunch', 'break1', 'break2')) /
        COUNT(DISTINCT date_trunc('day', l.started_at)
       ) AS labor_average
FROM log l
GROUP BY l.login
2021-05-23