指望 SQL 中带有条件语句的列?

Count on a column with a conditional statement in SQL?

我想要一个 table 这样的:

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 表达式,其开头如下:

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() 对每个 non-null 值递增,因此为避免计算任何不需要的条件,请不要 return 使用 else 的任何值。例如

count(case when d.payment_date < event_date then user_id end) as col1

或者,如果您希望在查询代码中更明确,请使用 else 到 return NULL,这将不被计算在内,例如

count(case when d.payment_date < event_date then user_id else NULL end) as col1

nb: 除了 returning 列值之外,您还可以使用这样的常量:

count(case when d.payment_date < event_date then 1 end) as col1