首页 > 解决方案 > 按年和月提取布尔计数

问题描述

我有一张这样的桌子:

id   timestamp     alive
 1   2019-10-10    true
 2   2019-10-10    false
...  .........    .....
 N   2021-01-01    boolean

我需要的:

按年和月提取表有多少truefalse关系false/true。像这样:

 Period    True  False  false/true
 JAN-2019  1000   10      0.01

我尝试了什么:

我做了一些cte使用date_trunc,但我失败了很多,我放弃了。

标签: sqlpostgresql

解决方案


您可以使用以下内容:

with agg as (
    select cnv."Period"
          ,sum(case when     alive then 1        end) as "True"
          ,sum(case when not alive then 1 else 0 end) as "False"
    from (values                           -- vvvvvvvvvvvvvvvvvvvv
         (1,'2019-10-10'::date, true ) -- replace this values()
        ,(2,'2019-10-10'      , false) -- table with your
        ,(3,'2021-01-01'      , false) -- actual table
         ) dat(id,"timestamp",alive)       -- ^^^^^^^^^^^^^^^^^^^^
         cross join lateral (select to_char(dat."timestamp",'YYYY-MM')) cnv("Period")
    group by cnv."Period"
)
select *
      ,("False" * 1.0 / "True")::numeric(10,2) as "false/true"
from agg
order by "Period"
;
  • 横向连接只是将日期转换为格式yyyy-mm一次,因此可以多次引用结果
  • CTE对真假的次数进行一次计数,因此可以在比率计算中参考结果。请注意,通过省略elseoncase语句,将在没有出现 的期间sum()返回。然后该比率将显示而不是产生除以零错误nulltruenull
  • 比率计算将整数值乘以一个numeric值以避免整数除法舍入。然后它将结果转换为具有 2 个小数位的数字类型。

推荐阅读