1

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

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层级。

4

2 回答 2

2

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

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

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               |
于 2019-09-09T22:27:44.583 回答
1

我会这样解决它:

  • 创建一个包含所需类别、最小值/最大值和描述的表。
  • 加入该表以获取视图类别

示例查询:

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,并在外部查询中加入类别表以获得最终结果。这将更快,并且需要更少的数据库服务器内存。
于 2019-09-09T22:22:52.187 回答