PostgreSQL Как получить среднее значение суммы определенных строк - PullRequest
0 голосов
/ 30 мая 2018

Я прошу прощения, если название не очень подходящее, но у меня были небольшие проблемы с формулировкой краткого названия.В любом случае, у меня есть таблица, в которой ведется журнал состояний, в которых находится человек. Она выглядит следующим образом:

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

Мне нужно получать среднее значение только для трудовых периодов на ежедневной основе.для каждого пользователя.Поэтому в основном мне нужно сложить продолжительность для всего, кроме «ланча», «перерыва1» и «перерыва2» для любого дня и получить среднее значение для него.

Я пытался сделать это так, но проблема в том, что он не складывает трудовые журналы перед усреднением.Я не могу понять, как это сделать.

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

Очевидно, я не ожидаю, что кто-нибудь сделает это для меня.Мне просто нужно указать в правильном направлении.Я, очевидно, довольно далеки от решения, поэтому мне просто нужно подтолкнуть в правильном направлении.Заранее большое спасибо!

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Я думаю, вы хотите, чтобы общая сумма делилась на количество дней:

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
0 голосов
/ 30 мая 2018

Рассчитайте сумму за вход в систему и за первый день.

Затем рассчитайте среднее значение за вход в систему.

SELECT
    login, AVG(SumDuration) AS AvgDuration
FROM
    (
    SELECT
        login, started_at::date, SUM(duration) AS SumDuration
    FROM log
    WHERE log.state NOT IN ('lunch', 'break1', 'break2')
    GROUP BY login, started_at::date
    ) AS T
GROUP BY login;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...