0

我需要你的帮助来使用 case when 函数。(大概)

我有每天访问服务器的数据。但是,我想按访问频率对这些用户数据进行分组。这样我就可以将他们分成访问少于5次、5到10次和超过10次的组。我听说函数可以帮助这个的情况,但我不知道如何运行它。

下面列出的是我用来导出每日访问量的查询,下表是查询的输出。如果有人知道如何相应地编写该查询,请帮助我。非常感激。

select aid, count(result_type) as "daily_visits"


FROM [DBO].[TB_SESSION_LOG]

WHERE
    log_dt >= @start_date and
    log_dt < @end_date


group by svc_cd, aid
order by svc_cd, aid

在此处输入图像描述

4

3 回答 3

0

看来您正在寻找类似的东西

with dv_cte(aid, daily_visits) as (
    select aid, count(result_type)
    from [DBO].[TB_SESSION_LOG]
    where log_dt >= @start_date and
          log_dt < @end_date
    group by svc_cd, aid)
select
  case when daily_visits < 5 then '<5'
       when daily_visits < 10 then '>5 and <10'
       else '10+' end as grp,
  count(*) grp_count
from dv_cte
group by
  case when daily_visits < 5 then '<5'
       when daily_visits < 10 then '>5 and <10'
       else '10+' end;
于 2020-09-22T12:14:57.847 回答
0

CASE您可以使用如下方式分配分组:

  SELECT aid, COUNT(result_type) as daily_visits,
         (CASE WHEN COUNT(result_type) < 5 THEN 'less than 5'
               WHEN COUNT(result_type) < 10 THEN 'between 5 and 10'
               ELSE '10 or more
         END) as grp
  FROM [DBO].[TB_SESSION_LOG]
  WHERE log_dt >= @start_date and
        log_dt < @end_date
  GROUP BY aid

我不确定您是否需要额外的处理,但这似乎解决了您的问题。

svc_cd注意:这将从查询中删除。它似乎没有被使用。

于 2020-09-22T11:52:00.897 回答
0

尝试case和子查询或CTE

    select aid, count(result_type) as "daily_visits",
     case
      when count(result_type) < 5 then 0
      when count(result_type) between 5 and 10 then 1
      when count(result_type) > 10 then 2
     end as grp

    FROM [DBO].[TB_SESSION_LOG]
    WHERE
        log_dt >= @start_date and
        log_dt < @end_date

    group by svc_cd, aid
    order by svc_cd, aid

请注意,我没有测试上述查询,但它应该可以工作或可能需要小修复。

于 2020-09-22T05:01:43.547 回答