SQL 在一个 table 中找到数据总和的最大值,带有额外的列
SQL to find max of sum of data in one table, with extra columns
如果在别处有人问过这个问题,我们深表歉意。我整天都在看 Whosebug,还没有找到答案。我正在努力编写查询以从此示例数据中找到每个州的最高月销售额。
数据如下所示:
| order_id | month | cust_id | state | prod_id | order_total |
+-----------+--------+----------+--------+----------+--------------+
| 67212 | June | 10001 | ca | 909 | 13 |
| 69090 | June | 10011 | fl | 44 | 76 |
... etc ...
我的查询
SELECT `month`, `state`, SUM(order_total) AS sales
FROM orders GROUP BY `month`, `state`
ORDER BY sales;
| month | state | sales |
+------------+--------+--------+
| September | wy | 435 |
| January | wy | 631 |
... etc ...
returns 几百行:每个州每个月的销售额总和。我只希望 return 销售额最高的月份,但对于每个州。对于不同的州来说,这可能是不同的月份。
这个查询
SELECT `state`, MAX(order_sum) as topmonth
FROM (SELECT `state`, SUM(order_total) order_sum FROM orders GROUP BY `month`,`state`)
GROUP BY `state`;
| state | topmonth |
+--------+-----------+
| ca | 119586 |
| ga | 30140 |
returns 具有正确数据的正确行数。但我也希望查询给我月份列。无论我尝试使用 GROUP BY,我都找不到将结果限制为每个州一条记录的方法。我试过 PartitionBy 没有成功,也试过加入失败。
TL;DR: 一个查询给了我正确的列,但行太多;另一个查询给了我正确的行数(和正确的数据)但列数不足。
非常感谢收到任何使这项工作可行的建议。
我正在使用 Apache Drill,它显然符合 ANSI-SQL。希望这不会有太大区别 - 我假设解决方案在所有 SQL 引擎中都是相似的。
这个应该可以解决问题
SELECT t1.`month`, t1.`state`, t1.`sales`
FROM (
/* this one selects month, state and sales*/
SELECT `month`, `state`, SUM(order_total) AS sales
FROM orders
GROUP BY `month`, `state`
) AS t1
JOIN (
/* this one selects the best value for each state */
SELECT `state`, MAX(sales) AS best_month
FROM (
SELECT `month`, `state`, SUM(order_total) AS sales
FROM orders
GROUP BY `month`, `state`
)
GROUP BY `state`
) AS t2
ON t1.`state` = t2.`state` AND
t1.`sales` = t2.`best_month`
它基本上是您编写的两个查询的组合。
试试这个:
SELECT `month`, `state`, SUM(order_total) FROM orders WHERE `month` IN
( SELECT TOP 1 t.month FROM ( SELECT `month` AS month, SUM(order_total) order_sum FROM orders GROUP BY `month`
ORDER BY order_sum DESC) t)
GROUP BY `month`, state ;
如果在别处有人问过这个问题,我们深表歉意。我整天都在看 Whosebug,还没有找到答案。我正在努力编写查询以从此示例数据中找到每个州的最高月销售额。
数据如下所示:
| order_id | month | cust_id | state | prod_id | order_total |
+-----------+--------+----------+--------+----------+--------------+
| 67212 | June | 10001 | ca | 909 | 13 |
| 69090 | June | 10011 | fl | 44 | 76 |
... etc ...
我的查询
SELECT `month`, `state`, SUM(order_total) AS sales
FROM orders GROUP BY `month`, `state`
ORDER BY sales;
| month | state | sales |
+------------+--------+--------+
| September | wy | 435 |
| January | wy | 631 |
... etc ...
returns 几百行:每个州每个月的销售额总和。我只希望 return 销售额最高的月份,但对于每个州。对于不同的州来说,这可能是不同的月份。
这个查询
SELECT `state`, MAX(order_sum) as topmonth
FROM (SELECT `state`, SUM(order_total) order_sum FROM orders GROUP BY `month`,`state`)
GROUP BY `state`;
| state | topmonth |
+--------+-----------+
| ca | 119586 |
| ga | 30140 |
returns 具有正确数据的正确行数。但我也希望查询给我月份列。无论我尝试使用 GROUP BY,我都找不到将结果限制为每个州一条记录的方法。我试过 PartitionBy 没有成功,也试过加入失败。
TL;DR: 一个查询给了我正确的列,但行太多;另一个查询给了我正确的行数(和正确的数据)但列数不足。
非常感谢收到任何使这项工作可行的建议。
我正在使用 Apache Drill,它显然符合 ANSI-SQL。希望这不会有太大区别 - 我假设解决方案在所有 SQL 引擎中都是相似的。
这个应该可以解决问题
SELECT t1.`month`, t1.`state`, t1.`sales`
FROM (
/* this one selects month, state and sales*/
SELECT `month`, `state`, SUM(order_total) AS sales
FROM orders
GROUP BY `month`, `state`
) AS t1
JOIN (
/* this one selects the best value for each state */
SELECT `state`, MAX(sales) AS best_month
FROM (
SELECT `month`, `state`, SUM(order_total) AS sales
FROM orders
GROUP BY `month`, `state`
)
GROUP BY `state`
) AS t2
ON t1.`state` = t2.`state` AND
t1.`sales` = t2.`best_month`
它基本上是您编写的两个查询的组合。
试试这个:
SELECT `month`, `state`, SUM(order_total) FROM orders WHERE `month` IN
( SELECT TOP 1 t.month FROM ( SELECT `month` AS month, SUM(order_total) order_sum FROM orders GROUP BY `month`
ORDER BY order_sum DESC) t)
GROUP BY `month`, state ;