sql - 按年和月提取布尔计数
问题描述
我有一张这样的桌子:
id timestamp alive
1 2019-10-10 true
2 2019-10-10 false
... ......... .....
N 2021-01-01 boolean
我需要的:
按年和月提取表有多少true
和false
关系false/true
。像这样:
Period True False false/true
JAN-2019 1000 10 0.01
我尝试了什么:
我做了一些cte
使用date_trunc
,但我失败了很多,我放弃了。
解决方案
您可以使用以下内容:
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对真假的次数进行一次计数,因此可以在比率计算中参考结果。请注意,通过省略
else
oncase
语句,将在没有出现 的期间sum()
返回。然后该比率将显示而不是产生除以零错误null
true
null
- 比率计算将整数值乘以一个
numeric
值以避免整数除法舍入。然后它将结果转换为具有 2 个小数位的数字类型。
推荐阅读
- java - 我在 IntelliJ IDEA 中创建了 javafx 应用程序,那么我如何在没有 IDE 或 Windows 控制台的情况下使用它?
- swift - Yandex Mapkit iOS:动画地标
- jquery - 使用 Lodash 在 CKEditor 中显示 RichText
- ios - UICollectionView 中未显示单元格返回到`cellProvider`
- javascript - 为什么 JQuery 不从替换 div 传递 post_id 和 post_type
- python - PIP virtualenv 和 APT python-virtualenv 有什么区别?
- python - 将用户输入保存为pygame中的变量
- xml - 在 xslt 1.0 中使用 tokenize 和/或 analyze-string() 将时间格式“HH:MM:SS.SSS”转换为毫秒
- java - 没有从数据库的 LiveData 观察者获取数据
- r - 将低频计数归入单个“其他”类别