首页 > 解决方案 > 计数不同时的MySQL案例

问题描述

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

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 次,因此它在该< 1K Views层中。视频 2 和 3 分别达到 125,000 和 150,000 次观看。所以他们在100K to 1M Views层级。

标签: mysqlsqlgroup-bycountcase

解决方案


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

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

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

DB Fiddle 上的演示

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

推荐阅读