【问题标题】:SQL relative percentage for each country每个国家/地区的 SQL 相对百分比
【发布时间】:2021-12-04 23:48:09
【问题描述】:

我有一个表:maps_query,如下所示:

CREATE TABLE maps_query 
(
    id           int 
    day          varchar
    search_query varchar
    country      varchar
    query_score  int
)

问题是输出每个国家的 maps_query 查询的相对百分比。

想要的输出如下:

country     pct
----------------
CA          0.13
FR          0.45
GB          0.21

我不太明白这里的相对百分比是多少,但我认为它要求输出(一个国家/地区的 search_query 计数/所有国家/地区的所有 search_query)?

会像下面这样工作吗?

Select 
    country, 
    (sum(search_query) / sum(search_query) over () * 100) pct
From 
    map_search
Group by 
    country 

【问题讨论】:

  • 您应该始终使用您正在使用的 DBMS 标记您的 SQL 请求。那里有应用幼儿园数学的 DBMS:例如 7 / 2 = 3,而不是 7 / 2 = 3.5。

标签: sql percentage


【解决方案1】:

你几乎拥有它。这是您的 SQL 稍作调整:

SELECT country
     , SUM(query_score) / (SUM(SUM(query_score)) OVER ()) AS pct
     , SUM(query_score)
     , SUM(SUM(query_score)) OVER ()
  FROM map_search
 GROUP BY country
;

结果,使用一些测试数据:

+---------+--------+------------------+-------------------------------+
| country | pct    | SUM(query_score) | SUM(SUM(query_score)) OVER () |
+---------+--------+------------------+-------------------------------+
| C1      | 0.5323 |             3300 |                          6200 |
| C2      | 0.4677 |             2900 |                          6200 |
+---------+--------+------------------+-------------------------------+

search_query 不是数字类型。我想你的意思是query_score。

如果您的预期结果不是百分比,而只是 0 和 1 之间的分数,则无需乘以 100。

您对窗口函数的使用不太有效,因为您尝试将SUM OVER 设为非聚合(表达式在功能上不依赖于GROUP BY 术语)。

我通过使用 SUM(query_score) 作为窗口函数参数中使用的表达式解决了这个问题。

【讨论】:

    【解决方案2】:

    首先计算总搜索查询,然后使用该总数来获得每个国家/地区的相对百分比。

    with total as
               ( select sum(search_query) as total
               from maps_query)
    
    select country,
           search_query / total.total 
           from maps_query,total
    

    【讨论】:

    • 请不要使用逗号分隔的连接。它们在 1992 年被淘汰。如果您想要交叉连接,请使用 from maps_query cross join total。不过,我更喜欢 OP 的方法。这对于窗口函数来说是一项足够的任务。你没有解释为什么你不建议使用它,而是推荐一种不同的方法。
    【解决方案3】:

    search_query 似乎是一个查询字符串。你不能总结它,它不是一个数字。您可能想要做的是 count 每个国家/地区的查询。

    除此之外,您的查询看起来还不错,但如果 search_query 确实是一个要加起来的数字,那么您必须计算总和和总和:sum(search_query) / sum(sum(search_query)) over ()。

    您的查询已更正:

    Select 
        country, 
        (count(*) / sum(count(*)) over () * 100) as pct
    From 
        map_search
    Group by 
        country 
    Order by 
        country;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2022-11-19
      • 1970-01-01
      相关资源
      最近更新 更多