Mysql 有没有更好的方法来优化SQL中的窗口函数除法?
假设我们要计算每个州在数据集中的城市比例。e、 内华达州占表中城市总数的25% 表架构: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
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;