Сумма количества элементов в запросе SQL на основе DATE_TRUNC - PullRequest
2 голосов
/ 07 января 2020

У меня есть таблица, которая содержит данные о состоянии события, например:

  ID             Time               Status
------  --------------------------  ------
357920  2019-12-25 09:31:38.854764    1
362247  2020-01-02 09:31:42.498483    1
362248  2020-01-02 09:31:46.166916    1
362249  2020-01-02 09:31:47.430933    1
362300  2020-01-03 09:31:46.932333    1
362301  2020-01-03 09:31:47.231288    1

Я хотел бы создать запрос, который будет возвращать число успешных событий в день, поэтому:

         Time              Count
-------------------------- -----
2019-12-25 00:00:00.000000   1
2020-01-02 00:00:00.000000   3
2020-01-03 00:00:00.000000   2

Я наткнулся на этот SO-ответ на аналогичный вопрос, но есть ответ для всех данных, возвращаемых запросом, тогда как мне нужна сумма, сгруппированная по диапазону дат.

Кроме того, я не могу использовать BETWEEN для выбора определенного c диапазона дат, поскольку этот запрос предназначен для панели инструментов Grafana, а диапазон дат определяется пользовательским интерфейсом панели управления. Я использую Postgres для диалекта SQL, на случай, если это имеет значение.

Ответы [ 2 ]

1 голос
/ 07 января 2020

Вам необходимо удалить время из time компонента. В большинстве баз данных вы можете сделать это путем преобразования в date:

select cast(time as date) as dte, 
       sum(case when status = 1 then 1 else 0 end) as num_successful
from t
group by cast(time as date)
order by dte;

. Предполагается, что 1 означает «успешно».

cast() не работает в все базы данных. Другими альтернативами являются такие вещи, как trunc(time), date_trunc('day', time), date_trunc(time, day) - и, без сомнения, многие другие.

В Postgres я бы сказал следующее:

select date_trunc('day', time) as dte, 
       count(*) filter (where status = 1) as num_successful
from t
group by dte
order by dte;
0 голосов
/ 07 января 2020

Как примерно так:

SELECT date(Time), sum(status) 
FROM table 
GROUP BY date(Time)
ORDER BY min(Time)
...