Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 有没有更好的方法来优化SQL中的窗口函数除法?_Mysql_Sql - Fatal编程技术网

Mysql 有没有更好的方法来优化SQL中的窗口函数除法?

Mysql 有没有更好的方法来优化SQL中的窗口函数除法?,mysql,sql,Mysql,Sql,假设我们要计算每个州在数据集中的城市比例。e、 内华达州占表中城市总数的25% 表架构: state - string of state name city - string of city name 我的答案如下,有没有更好的方法来优化它而不必求助于子查询?(顺便说一句,我的代码有效) 只需从表中选择一次城市数量,然后使用它: SET @TOTAL = (SELECT COUNT(*) FROM EXAMPLE_DATA); SELECT COUNT(*)/@TOTAL, STATE FRO

假设我们要计算每个州在数据集中的城市比例。e、 内华达州占表中城市总数的25%

表架构:

state - string of state name
city - string of city name
我的答案如下,有没有更好的方法来优化它而不必求助于子查询?(顺便说一句,我的代码有效)


只需从表中选择一次城市数量,然后使用它:

SET @TOTAL = (SELECT COUNT(*) FROM EXAMPLE_DATA);
SELECT COUNT(*)/@TOTAL, STATE FROM EXAMPLE_DATA GROUP BY State;
其中我使用了以下DDL:

CREATE Table EXAMPLE_DATA
(
STATE varchar(255),
CITY varchar(255)
);

INSERT INTO EXAMPLE_DATA (State, City) VALUES("Bavaria", "Munich");
INSERT INTO EXAMPLE_DATA (State, City) VALUES("Bavaria", "Ingolstadt");
INSERT INTO EXAMPLE_DATA (State, City) VALUES("Bavaria", "Eichstätt");
INSERT INTO EXAMPLE_DATA (State, City) VALUES("Berlin", "Berlin");
INSERT INTO EXAMPLE_DATA (State, City) VALUES("Saxonia", "Leipzig");
INSERT INTO EXAMPLE_DATA (State, City) VALUES("Saxonia", "Dresden");
结果:

COUNT(*)/@TOTAL STATE
0.5000 Bavaria
0.1667 Berlin
0.3333 Saxonia
答案是肯定的。您可以使用窗口功能:

SELECT state, count(*) AS counts,
       COUNT(*) / SUM(COUNT(*)) OVER () as ratio
FROM table
GROUP BY state;

请注意,您尚未提供示例数据。我猜
city
永远不会
NULL
,因此
COUNT(*)
等同于
COUNT(city)
。如果
city
可以为
NULL
,则使用
COUNT(city)

不能从聚合函数中调用聚合函数。count(city)/sum(count(city))是不可能的。对于每一级的聚合,您必须一次执行一个,因此,必须执行一个子查询。
SELECT state, count(*) AS counts,
       COUNT(*) / SUM(COUNT(*)) OVER () as ratio
FROM table
GROUP BY state;