我想要一張這樣的桌子:
cycle_end_date | count(user_id) | count(repaid_user_id) | event_ts | repayment_ts
15th Jan | 20 | 15 | 23rd Jan | 25th Jan
15th Jan | 30 | 30 | 24th Jan | 24th Jan
我正在使用以下查詢:
select
date(cycle_end_date) as cycle_end_date
,date(payload_event_timestamp interval '5 hours 30 minutes') as event_date
,d.payment_date
,count( s.user_id) as count
,count(case s.user_id when d.payment_date < event_date then 1 else 0 end) as repaid_users
d.payment_date 取自另一個查詢 -
case when ots_created_at is null then
current_date else date(ots_created_at interval ' 5 hours 30 minutes')
end as payment_date
這給了我一個錯誤:ProgrammingError: operator does not exist: character varying = boolean
基本上我想要在觸發事件當天還款的用戶數量。這基本上是如果事件日期等于還款日期,我們可以發現這些許多用戶在該事件日期付款。如何找到這個?
uj5u.com熱心網友回復:
您已嘗試使用 case 運算式的“簡短形式”,其開頭如下:
case s.user_id when d.payment_date
為了使這種格式有效,when 之后的語法假設相等比較(例如,when d.payment_date假設=),并且在這種簡短形式中,它只能是假設的相等運算子。對于更復雜的比較(小于、不等于等),有必要使用較長的 case 運算式格式,如下所示:
case when d.payment_date < event_date then user_id end
請注意,聚合函式 COUNT() 會為每個非空值遞增,因此為避免計算任何不需要的條件,請勿使用else. 例如
count(case when d.payment_date < event_date then user_id end) as col1
或者,如果您希望在查詢代碼中更明確,請使用else回傳不計算在內的 NULL,例如
count(case when d.payment_date < event_date then user_id else NULL end) as col1
注意:您可以使用這樣的常量,而不是回傳列值:
count(case when d.payment_date < event_date then 1 end) as col1
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/442342.html
標籤:sql PostgreSQL 聚合函数
上一篇:根據另一列的值選擇一列的值
