簡體   English   中英

MySQL數量不同時的情況

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM