【问题标题】:MySQL case when count distinct计数不同时的MySQL案例
【发布时间】:2020-01-11 16:13:46
【问题描述】:

我正在尝试按收视等级计算不同视频的计数。我有下表:

vid_id  views
1       6
1       10
1       900
2       850
2       125000
3       1010
3       12239
3       150000

我尝试使用此代码来获得我想要的输出:

SELECT
    CASE
        WHEN views < 1000 THEN '< 1K Views'
            WHEN views >= 1000 AND views < 10000 THEN '1K to 10K Views'
            WHEN views >= 10000 AND views < 100000 THEN '10K to 100K Views'
            WHEN views >= 100000 AND views < 1000000 THEN '100K to 1M Views'
            ELSE '1M+ Views'
    END AS tier,
    COUNT(distinct vid_id)
FROM
    test
GROUP BY
    tier

由于每个 vid_id 有多个条目,我想使用每个 vid_id 的最大观看次数对每个层的视频计数进行分组。所以我的输出应该是:

tier                COUNT(views)
< 1K Views          1 
100K to 1M Views    2 

视频 #1 的观看次数最多达到 900 次,因此它位于 &lt; 1K Views 层中。视频 2 和 3 分别达到 125,000 和 150,000 次观看。所以他们在100K to 1M Views 层。

【问题讨论】:

  • 您的语句将失败.. 分组并选择

标签: mysql sql group-by count case


【解决方案1】:

一种解决方案是分两步进行:

  • 首先,使用聚合子查询计算每部电影的最大观看次数
  • 然后,将上述信息分层

SQL:

SELECT
    CASE
        WHEN views < 1000 THEN '< 1K Views'
        WHEN views >= 1000 AND views < 10000 THEN '1K to 10K Views'
        WHEN views >= 10000 AND views < 100000 THEN '10K to 100K Views'
        WHEN views >= 100000 AND views < 1000000 THEN '100K to 1M Views'
        ELSE '1M+ Views'
    END AS tier,
    COUNT(*) as distinct_videos
FROM (
    SELECT vid_id, MAX(views) views FROM mytable GROUP BY vid_id
) x
GROUP BY tier

Demo on DB Fiddle

| tier             | distinct_videos |
| ---------------- | --------------- |
| 100K to 1M Views | 2               |
| < 1K Views       | 1               |

【讨论】:

    【解决方案2】:

    我会这样解决:

    • 创建一个包含所需类别的表格,并附上最小值/最大值和说明。
    • 加入该表以获取视图类别

    查询示例:

    select vid_id, views, category_id
    from test
    join viewgroup on viewgroup.min >= tier.views and viewgroup.max < tier.views
    

    你会得到这样的中间结果:

    vid_id  views     category_id    tier
    1       6         1              < 1K Views 
    1       10        1              < 1K Views
    1       900       1              < 1K Views
    2       850       1              < 1K Views
    2       125000    4              100K to 1M Views
    3       1010      2              1K to 10K Views
    3       12239     3              10K to 100K Views
    3       150000    4              100K to 1M Views 
    

    现在,通过创建外部查询很容易获得其中的数量:

    select tier, count(*) from
    (
      select vid_id, views, category_id, tier
      from test
      join viewgroup on viewgroup.min >= tier.views and viewgroup.max < tier.views
    ) 
    group by tier
    

    一些最后的笔记:

    • 您可以像在示例中那样动态计算,而不是使用表格。
    • 如果您有大量数据,请不要在内部查询中使用tier。相反,收集 category_id,并在外部查询中加入类别表以获得最终结果。这样会更快,并且需要更少的数据库服务器内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-11
      • 2017-03-09
      • 1970-01-01
      • 2012-06-15
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多