我有一張這樣的表:
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但我失敗了很多,我放棄了。
uj5u.com熱心網友回復:
您可以使用以下內容:
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"
;
- 橫向聯接只是? ? NV專家評審組的日期
yyyy-mm格式一次,這樣的結果可以被參考多次 - CTE統計一次真偽數,結果可以在比值計算中參考。請注意,通過省略
elseoncase陳述句, thesum()將回傳null沒有出現true. 然后該比率將顯示null而不是產生除以零誤差 - 比率計算將整數值乘以一個
numeric值以避免整數除法舍入。然后將結果轉換為帶有 2 個小數位的數字型別。
uj5u.com熱心網友回復:
您可以FILTER為每個條件(活動和非活動)使用一個子句,然后使用格式化的時間戳對其進行聚合to_char,例如
SELECT
to_char(timestamp,'MON-YYYY'),
count(*) FILTER (WHERE alive) AS alive,
count(*) FILTER (WHERE NOT alive) AS not_alive,
count(*) FILTER (WHERE alive)::numeric /
nullif(count(*) FILTER (WHERE NOT alive),0)::numeric AS "true/false"
FROM t
GROUP BY to_char(timestamp,'MON-YYYY');
演示: db<>fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/346934.html
標籤:sql PostgreSQL
