在SQL中对具有条件语句的列执行postgreCount



我想要一个这样的表:

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

基本上,我想要在事件触发当天还款的用户数。基本上,如果事件日期等于还款日期,我们可以发现这些用户在该事件日期付款。如何找到这个?

您试图使用;缩写";案例表达式的开头是这样的:

case s.user_id when d.payment_date

为了使这种格式有效,when之后的语法假设相等的比较(例如when d.payment_date假设=(,并且在这种简短形式中,它只能是假设的相等运算符。对于更复杂的比较(小于、不等于等(,有必要使用更长格式的事例表达式,如以下所示:

case when d.payment_date < event_date then user_id end

请注意,聚合函数COUNT((为每个非null值递增,因此为了避免计算任何不需要的条件,请不要使用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

最新更新