如果标题不太恰当,我深表歉意,但是在编写简洁的标题时遇到了一些麻烦。无论如何,我有一个表可以记录一个人所处的状态。它看起来像:
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
显然,我不希望任何人为我做这件事。我只需要指出正确的方向。我显然可以从解决方案中找到很多方法,所以我只需要朝正确的方向推进即可。提前非常感谢您!
我认为您希望将总数除以天数:
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