Я написал запрос, который возвращает гистограмму в терминале, используя интерфейс командной строки Postgres. Запрос медленный и неэффективный. Я хотел бы изменить это.
В основе у нас есть довольно простой запрос. Мы хотим, чтобы каждая строка была частью общего количества строк в нашей таблице. Предположим, что наше жестко запрограммированное количество строк равно N_ROWS
, а наша таблица равна my_table
.
Кроме того, допустим, N_ROWS
равно 8.
select
(select count(id) from my_table) / N_ROWS * (N_ROWS - num) as level
from (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8)) as t (num)
В моем случае это возвращает мою ось Y диаграммы как:
level
-------
71760
62790
53820
44850
35880
26910
17940
8970
0
Вы уже видите проблемы с этим запросом.
Могу ли я программно сгенерировать ряд строк, используя N_ROWS
, а не жестко задавать значение каждой строки в VALUES
? Мне также не нравится, как я выполняю новый подсчет по всей таблице для каждой строки, очевидно.
Теперь нам нужна наша ось X, и вот что я придумал:
select
r.level,
case
when (
select count(id) from my_table where created_at_utc<= '2019-01-01 00:00:00'::timestamp without time zone
) >= r.level then true
end as "2019-01-01"
from (
select (select count(id) from my_table) / N_ROWS * (N_ROWS - num) as level from (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8)) as t (num)
) as r;
Что возвращает наше первое ведро:
level | 2019-01-01
-------+------------
71760 |
62790 |
53820 |
44850 |
35880 |
26910 | t
17940 | t
8970 | t
0 | t
Я бы не хотел жестко кодировать оператор case для каждого сегмента, но, конечно, я так и сделал. Результаты - это то, что я искал.
level | 2019-01-01 | 2019-02-01 | 2019-03-01 | 2019-04-01 | 2019-05-01 | 2019-06-01 | 2019-07-01 | 2019-08-01 | 2019-09-01 | 2019-10-01 | 2019-11-01 | 2019-12-01
-------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------
71760 | | | | | | | | | | | | t
62790 | | | | | t | t | t | t | t | t | t | t
53820 | | | | t | t | t | t | t | t | t | t | t
44850 | | | t | t | t | t | t | t | t | t | t | t
35880 | | t | t | t | t | t | t | t | t | t | t | t
26910 | t | t | t | t | t | t | t | t | t | t | t | t
17940 | t | t | t | t | t | t | t | t | t | t | t | t
8970 | t | t | t | t | t | t | t | t | t | t | t | t
0 | t | t | t | t | t | t | t | t | t | t | t | t
VALUES
взгляните наgenerate_series()
. Документы: postgresql.org/docs/current/functions-srf.html - person Islingre   schedule 13.11.2019