[英]MySQL case when count distinct
我試圖通過收視級別來獲取不同視頻的數量。 我有下表:
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
的最大視圖數對每個層的視頻計數進行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
層。
一種解決方案是分兩步進行:
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小提琴演示 :
| tier | distinct_videos |
| ---------------- | --------------- |
| 100K to 1M Views | 2 |
| < 1K Views | 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,並在外部查詢中加入最終結果的類別表。 這將更快,並且需要更少的內存用於數據庫服務器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.