【问题标题】:Obtain the most used type for an id based on its views根据视图获取 id 最常用的类型
【发布时间】:2019-01-28 10:12:20
【问题描述】:

我正在尝试从我的 SQL 中找出查看次数最多的类型,我很新,所以我不确定在 RANK、COUNT 和/或 SUM 之间使用哪种逻辑。

所以我有三列:ID、seller_type 和 view_count

+----+-------------+------------+--------+-------+
| ID | Seller_type | view_count |  Week  |  Day  |
+----+-------------+------------+--------+-------+
| 33 | Vendor      |         54 | Week1  | Day 1 |
| 33 | Vendor      |         45 | Week1  | Day 2 |
| 33 | Marketplace |         68 | Week2  | Day 4 |
| 33 | Marketplace |         12 | Week2  | Day 2 |
| 32 | Vendor      |         93 | Week2  | Day 3 |
| 33 | Third-party |         74 | Week1  | Day 6 |
| 32 | Third-party |         10 | Week1  | Day 1 |
+----+-------------+------------+--------+-------+

基本上,我有一个表格,其中有一个 ID、一个卖家类型和一个 ID 的查看次数。同一个卖家的唯一 ID 可以有不止一行(因为它们可以是不同的周/天)。例如,我想要做的是计算在第 1 周内哪个卖家类型对 ID 33 的查看次数最多。在这种情况下,供应商 (54+45),而不是市场 (12)。

所以我的计划是开始使用 SUM:

WITH A AS (
SELECT
ID
,Seller_type
,SUM(view_count) as Total_views
,Week

FROM Table_A

GROUP BY
ID
,Seller_type
,Week
)

SELECT
CASE WHEN Week = 'Week1' THEN MAX(Total_views)
CASE WHEN Week = 'Week2' THEN

FROM A

因此,对于子查询 A 中每个 ID 的每个卖家,我都有总计,我想在我的主查询中使用 CASE 来指示选择 max total_views 的卖家类型。但我不知道如何写我的 CASE WHEN。

任何 cmets/适应症将不胜感激!

谢谢!

【问题讨论】:

    标签: sql rank


    【解决方案1】:

    你似乎基本上想要聚合:

    select seller_type, week, sum(view_count)
    from t
    group by seller_type, week;
    

    然后你想要一些过滤并选择最上面的一个:

    select seller_type, week, sum(view_count)
    from table_a
    where week = 'Week 1'
    group by seller_type, week
    order by sum(view_count)
    fetch first 1 row only;
    

    请注意,并非所有数据库都支持标准的fetch first 子句——但都支持某种说法(比如select toplimit)。

    【讨论】:

      【解决方案2】:

      如果我做对了,您希望获得每周观看次数最多的卖家类型。您可以为此使用rank()row_number()。使用rank(),如果有多个具有相同顶视图计数的记录,您将获得所有顶记录。将rank() 替换为row_count() 以在这种情况下仅(随机)选择一条记录。

      WITH
      a
      ...
      SELECT id,
             seller_type,
             total_views,
             week
             FROM (SELECT id,
                          seller_type,
                          total_views,
                          week
                          rank() OVER (PARTITION BY week
                                       ORDER BY total_views DESC) r
                          FROM a)
             WHERE r = 1;
      

      【讨论】:

        猜你喜欢
        • 2014-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多