【问题标题】:Vertica: Return zero if no records foundVertica:如果未找到记录,则返回零
【发布时间】:2021-11-24 11:04:39
【问题描述】:

我正在运行此查询以获取过去 3 个月内每个用户的平均登录次数。如果用户在最近 3 个月内登录过,则取其平均值,否则返回 0。

我尝试了多种不同的方法,但似乎如果用户在过去 3 个月内没有登录,则没有记录,并且 count() 不返回 0。它只是什么都不返回。

1) select case count(*)
                WHEN 0
                    THEN 0
                    ELSE count(creationTS) / 3
                END as average
              from table_name where creationTS >= add_months(now(), -3)
              and userId = '110'
             group by userId;

2) select COALESCE(count(creationTS)/3,0) as average
              from table_name where creationTS >= add_months(now(), -3)
              and userId = '110'
             group by userId;

如果找到条件“creationTS >= add_months(now(), -3)”的记录但不存在记录,则它会给出正确的结果,它不会返回任何内容。在那种情况下我怎么能返回 0。

【问题讨论】:

    标签: sql database vertica


    【解决方案1】:

    试试这样:

    a) 在全选中从基表中获取所有不同的用户 ID。

    b) 在用户 id 和不早于 3 个月前的登录日期相等的情况下,将全选返回与基表的左连接

    c) 统计基表中找到的用户id-s,如果连接失败默认为NULL,如果为NULL,使用NVL()强制为0,并按用户id分组

    WITH
    -- sample input data,not part of real query
    indata(userid,login_dt) AS (
                SELECT 'arthur',   DATE '2021-09-15'
      UNION ALL SELECT 'arthur',   DATE '2021-08-27'
      UNION ALL SELECT 'arthur',   DATE '2021-08-01'
      UNION ALL SELECT 'trillian', DATE '2021-09-27'
      UNION ALL SELECT 'trillian', DATE '2021-08-15'
      UNION ALL SELECT 'trillian', DATE '2021-06-27'
      UNION ALL SELECT 'ford',     DATE '2021-02-27'
      UNION ALL SELECT 'ford',     DATE '2021-04-27'
    )
    ,
    userids AS (
      SELECT DISTINCT
        userid
      FROM indata
    )
    SELECT
      userids.userid
    , NVL(COUNT(indata.userid),0) AS login_count
    FROM userids
    LEFT JOIN indata
     ON userids.userid=indata.userid
    AND login_dt >= ADD_MONTHS(CURRENT_DATE,-3)
    GROUP BY
      userids.userid
    ;
      userid  | login_count 
    ----------+-------------
     arthur   |           3
     ford     |           0
     trillian |           2
    

    【讨论】:

      猜你喜欢
      • 2013-07-24
      • 2012-05-20
      • 2020-10-28
      • 2015-02-14
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      相关资源
      最近更新 更多