SQL 每个国家/地区的相对百分比

SQL relative percentage for each country

我有一个 table: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 

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

with total as
           ( select sum(search_query) as total
           from maps_query)

select country,
       search_query / total.total 
       from maps_query,total

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;

你快搞定了。这是您的 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。

您对 window 函数的使用不太有效,因为您试图 SUM OVER 非聚合(表达式在功能上不依赖于 GROUP BY 项)。

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