SQL 查询用户每月的最大金额
SQL query for finding maximum amount month wise with the user
我想打印最大金额的用户每月的最大金额。我的 table 结构是
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| customername | varchar(20) | YES | | NULL | |
| processed_at | date | YES | | NULL | |
| amount | int(11) | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
和
打印月最大总和的查询是
SELECT MAX(A.AMT), A.month
FROM ( SELECT customername,SUM(amount) AS AMT, EXTRACT( month from processed_at) as month
FROM payments
GROUP BY customername,month) AS A
GROUP BY 2;
这是给出的结果
| MAX(A.AMT) | month |
+------------+-------+
| 1900 | 4 |
| 2400 | 3 |
有没有办法将客户名也映射到最大金额?
如果你是 运行 MySQL 8.0,你可以使用 window 功能:
SELECT *
FROM (
SELECT
customername,
SUM(amount) amt,
DATE_FORMAT(processed_at, '%Y-%m-01') yr_month,
RANK() OVER(PARTITION BY DATE_FORMAT(processed_at, '%Y-%m-01') ORDER BY SUM(amount) DESC) rn
FROM payments
GROUP BY customername, yr_month
) t
WHERE rn = 1
请注意,这在 GROUP BY
子句中包括月份 和 年份,以防您的数据分布超过 12 个月。
在早期版本中,一种选择是使用 HAVING
子句和相关聚合查询进行过滤:
SELECT
customername,
SUM(amount) amt,
DATE_FORMAT(processed_at, '%Y-%m-01') yr_month
FROM payments p
GROUP BY customername, yr_month
HAVING COUNT(*) = (
SELECT SUM(p1.amount)
FROM payments p
WHERE DATE_FORMAT(p1.processed_at, '%Y-%m-01') = yr_month
GROUP BY p1.customername
ORDER BY SUM(p1.amount) DESC
LIMIT 1
)
我想打印最大金额的用户每月的最大金额。我的 table 结构是
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| customername | varchar(20) | YES | | NULL | |
| processed_at | date | YES | | NULL | |
| amount | int(11) | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
和 打印月最大总和的查询是
SELECT MAX(A.AMT), A.month
FROM ( SELECT customername,SUM(amount) AS AMT, EXTRACT( month from processed_at) as month
FROM payments
GROUP BY customername,month) AS A
GROUP BY 2;
这是给出的结果
| MAX(A.AMT) | month |
+------------+-------+
| 1900 | 4 |
| 2400 | 3 |
有没有办法将客户名也映射到最大金额?
如果你是 运行 MySQL 8.0,你可以使用 window 功能:
SELECT *
FROM (
SELECT
customername,
SUM(amount) amt,
DATE_FORMAT(processed_at, '%Y-%m-01') yr_month,
RANK() OVER(PARTITION BY DATE_FORMAT(processed_at, '%Y-%m-01') ORDER BY SUM(amount) DESC) rn
FROM payments
GROUP BY customername, yr_month
) t
WHERE rn = 1
请注意,这在 GROUP BY
子句中包括月份 和 年份,以防您的数据分布超过 12 个月。
在早期版本中,一种选择是使用 HAVING
子句和相关聚合查询进行过滤:
SELECT
customername,
SUM(amount) amt,
DATE_FORMAT(processed_at, '%Y-%m-01') yr_month
FROM payments p
GROUP BY customername, yr_month
HAVING COUNT(*) = (
SELECT SUM(p1.amount)
FROM payments p
WHERE DATE_FORMAT(p1.processed_at, '%Y-%m-01') = yr_month
GROUP BY p1.customername
ORDER BY SUM(p1.amount) DESC
LIMIT 1
)