Группа временных рядов по дням и видам - PullRequest
1 голос
/ 19 апреля 2020

Я создаю таблицу, используя команду ниже:

CREATE TABLE IF NOT EXISTS stats (
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  session_kind INTEGER NOT NULL,
  ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
)

Я вставляю некоторые данные временного ряда, используя команду ниже:

INSERT INTO stats (session_kind) values (?1)

Через некоторое время после выполнения несколько раз вставки Команда, у меня есть некоторые данные временных рядов, как показано ниже:

id    session_kind    ts
-----------------------------------------
1     0               2020-04-18 12:59:51  // day 1
2     1               2020-04-19 12:59:52  // day 2
3     0               2020-04-19 12:59:53
4     1               2020-04-19 12:59:54
5     0               2020-04-19 12:59:55
6     2               2020-04-19 12:59:56
7     2               2020-04-19 12:59:57
8     2               2020-04-19 12:59:58
9     2               2020-04-19 12:59:59
10    0               2020-04-20 12:59:51  // day 3
11    1               2020-04-20 12:59:52
12    0               2020-04-20 12:59:53
13    1               2020-04-20 12:59:54
14    0               2020-04-20 12:59:55
15    2               2020-04-20 12:59:56
16    2               2020-04-20 12:59:57
17    2               2020-04-20 12:59:58
18    2               2020-04-21 12:59:59  // day 4

Что бы я хотел иметь команду, которая группирует мои данные по дате от самого последнего дня до наименьшего числа и число каждого session_kind как показано ниже (я не хочу давать никаких параметров этой команде):

0    1    2    ts
-------------------------
0    0    1    2020-04-21  // day 4
3    2    3    2020-04-20  // day 3
2    2    4    2020-04-19  // day 2
1    0    0    2020-04-18  // day 1

Как я могу сгруппировать мои данные, как указано выше?

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Вы можете выполнить условную агрегацию:

select
    sum(session_kind= 0) session_kind_0,
    sum(session_kind= 1) session_kind_1,
    sum(session_kind= 2) session_kind_2,
    date(ts) ts_day
from mytable
group by date(ts)
order by ts_day desc

Если вы хотите что-то динамическое c, тогда может быть проще поместить результаты в строки, а не в столбцы:

select date(ts) ts_day, session_kind, count(*) cnt
from mytable
group by date(ts), session_kind
order by ts_day desc, session_kind
0 голосов
/ 19 апреля 2020

Если я правильно понимаю, вы просто хотите суммировать значения:

select date(timestamp),
       sum(case when session_kind = 1 then 1 else 0 end) as cnt_1,
       sum(case when session_kind = 2 then 1 else 0 end) as cnt_2,
       sum(case when session_kind = 3 then 1 else 0 end) as cnt_3
from t
group by date(timestamp);

Вы также можете упростить это:

select date(timestamp),
       sum( session_kind = 1 ) as cnt_1,
       sum( session_kind = 2 ) as cnt_2,
       sum( session_kind = 3 ) as cnt_3
from t
group by date(timestamp);
...