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 ;