sql - 如何编写 SQL 聚合函数/查询
问题描述
我有一个查询,显示每天的总值(金额总和)。查询:
SELECT CAST(date AS DATE), SUM(amount) AS total_amount FROM table
WHERE date BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 00:00:00'
GROUP BY CAST(date AS DATE)
CAST 是将日期时间格式缩写为日期。
现在我只想用 max 函数选择总和最高的那一天。为此,我尝试编写以下聚合查询:
SELECT s.date, s.total_amount
FROM (SELECT CAST(date AS DATE), SUM(amount) AS total_amount FROM table
WHERE date BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 00:00:00'
GROUP BY CAST(date AS DATE)) s
WHERE s.total_amount = (SELECT MAX(s.total_amount) FROM table)
这不起作用。我知道问题出在最后的 WHERE 子句上,但我需要帮助才能使它工作。
解决方案
ORDER BY
与 一起使用LIMIT
:
SELECT CAST(date AS DATE), SUM(amount) AS total_amount
FROM table
WHERE date BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 00:00:00'
GROUP BY CAST(date AS DATE)
ORDER BY total_amount DESC
LIMIT 1;
如果您正在使用,SQL Server
那么您可以使用TOP
:
SELECT TOP (1) CAST(date AS DATE), SUM(amount) AS total_amount
FROM table
WHERE date BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 00:00:00'
GROUP BY CAST(date AS DATE)
ORDER BY total_amount DESC;
如果你想要领带,那么你可以使用窗口功能:
SELECT t.*
FROM (SELECT CAST(date AS DATE), SUM(amount) AS total_amount,
RANK() OVER (ORDER BY SUM(amount) DESC) as Seq
FROM table
WHERE date BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 00:00:00'
GROUP BY CAST(date AS DATE)
) t
WHERE seq = 1;
您可以使用CTE
:
WITH CTE AS (
SELECT CAST(date AS DATE), SUM(amount) AS total_amount
FROM table
WHERE date BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 00:00:00'
GROUP BY CAST(date AS DATE)
)
SELECT c.*
FROM CTE C
WHERE C.total_amount = (SELECT MAX(total_amount) FROM CTE);
注意:如果您的 DBMS 不支持CTE
表达式,那么您需要在子查询中重复该SELECT
语句。
SELECT CAST(date AS DATE), SUM(amount) AS total_amount
FROM table
WHERE date BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 00:00:00'
GROUP BY CAST(date AS DATE)
HAVING SUM(amount) = (SELECT MAX(total_amount)
FROM (SELECT CAST(date AS DATE), SUM(amount) AS total_amount
FROM table
WHERE date BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 00:00:00'
GROUP BY CAST(date AS DATE)
) t
);
推荐阅读
- linux - 无法使用 netcat 正确传输文件接收到的文件与发送时不同
- spring-data-jpa - java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 with Javers @JaversSpringDataAuditable
- visual-studio-code - 计算诊断报告的范围
- python - 如何组合这些“for”语句?
- javascript - Google 文本到语音合成 REST API 500 内部错误
- php - 迁移后的 Worpress 文件权限和所有权
- elassandra - 如何在 Windows 上运行 elassandra
- sql - SQL语句中被零除如果返回被零除如何避免特定记录
- r - 在图例中获取线型虚线和颜色
- python - 在 Python 中将 3D 表面的数据数字化为分辨率较小的像素网格的最佳方式/方法是什么?