我使用 Postgres CLI 编写了一个在终端中返回条形图的查询。查询缓慢且效率低下。我想改变它。
在基础上,我们有一个非常简单的查询。我们希望每一行都是表中总行数的除法。假设我们硬编码的行数是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