【问题标题】:SQL Max value in a group [duplicate]组中的SQL最大值[重复]
【发布时间】:2020-03-31 22:41:57
【问题描述】:

我正在努力用 SQL 做一些事情,我确信这一定很简单,但我想不通。我想要一个组的 MAX() 值,但我也想要同一行中另一列的值作为最大值。这是一个示例表定义:

mysql> desc Sales;
+---------+---------+------+-----+---------+-------+
| Field   | Type    | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+-------+
| StoreID | int(11) | YES  |     | NULL    |       |
| Day     | int(11) | YES  |     | NULL    |       |
| Amount  | int(11) | YES  |     | NULL    |       |
+---------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)

这里有一些数据:

mysql> SELECT * FROM Sales;
+---------+------+--------+
| StoreID | Day  | Amount |
+---------+------+--------+
|       1 |    1 |     44 |
|       1 |    2 |     31 |
|       1 |    3 |     91 |
|       2 |    1 |     93 |
|       2 |    2 |     32 |
|       2 |    3 |     41 |
|       3 |    1 |     48 |
|       3 |    2 |     95 |
|       3 |    3 |     12 |
+---------+------+--------+
9 rows in set (0.00 sec)

我想知道的是,Day 对于每个 StoreID 的销售额 (Amount) 最多。

现在我知道我可以做到:

SELECT StoreID, MAX(Amount) FROM Sales GROUP BY StoreID;
+---------+-------------+
| StoreID | MAX(Amount) |
+---------+-------------+
|       1 |          91 |
|       2 |          93 |
|       3 |          95 |
+---------+-------------+
3 rows in set (0.00 sec)

这告诉我每家商店的最大数量,但我真正想要的是它发生的那一天。但是我无法将 Day 添加回查询中,因为它不在 group by 中,而且我认为我真的不想按该值进行分组吗?

我不知道从这里去哪里。

简而言之,我想要的结果应该是这样的:

+---------+------+--------+
|       1 |    3 |     91 |
|       2 |    1 |     93 |
|       3 |    2 |     95 |
+---------+------+--------+

【问题讨论】:

  • 有哪些超过 1 天的最大值?
  • 对于greatest-n-per-group 标签,Stack Overflow 上还有很多其他答案。

标签: mysql sql greatest-n-per-group


【解决方案1】:

您要过滤。这是使用相关子查询的一种简单方法:

select s.*
from s
where s.sales = (select max(s2.sales)
                 from sales s2
                 where s2.storeId = s.storeId
                );

如果您的数据偏大,您需要在sales(storeId, sales) 上建立索引。

【讨论】:

    【解决方案2】:

    对于每家商店的最高金额,同一家商店不会有更高的金额。

    SELECT *
    FROM Sales s
    WHERE NOT EXISTS (
        SELECT 1 
        FROM Sales s2
        WHERE s2.StoreID = s.StoreID
          AND s2.Amount > s.Amount
    )
    ORDER BY Amount ASC, StoreID ASC;
    

    测试here

    【讨论】:

      【解决方案3】:

      通常,您可以只加入聚合查询以获取其余的行数据...

      SELECT s.*
      FROM Sales AS s
      INNER JOIN (
         SELECT StoreID, MAX(Amount) AS MaxAmount
         FROM Sales 
         GROUP BY StoreID
      ) AS m ON s.StoreID = m.StoredID AND s.Amount = m.MaxAmount
      ;
      

      如果同一 StoreID 有多个具有 MaxAmount 的销售,则查询将返回所有销售,而不仅仅是其中一个。

      【讨论】:

        猜你喜欢
        • 2017-08-11
        • 2021-07-25
        • 2017-09-12
        • 2015-06-23
        • 2017-12-20
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多