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 函数参数中使用的表达式解决了这个问题。
我有一个 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 函数参数中使用的表达式解决了这个问题。