我有一个SQL服务器表‘Water’,它按每个米存储每小时的用水量.我正在try 汇总所有使用情况,以确定每天的最大使用小时数以及它发生的时间.我遇到的问题是如何 for each MAX记录返回‘TIME_LOCAL’.

我最初的查询总和是每天每个小时的所有使用量.

SELECT SUM(consumption) AS Gallons,
time_local,
date_local
FROM water
WHERE consumption_period = 'HOUR' AND date_local > DATEADD(day,-2, GETDATE())
GROUP BY 
time_local,
date_local

它返回一天中每小时的总消耗量.

gallons time_local date_local
275,009 2023-12-19T15:00:00 2023-12-19
184,074 2023-12-19T06:00:00 2023-12-19
392,489 2023-12-18T12:00:00 2023-12-18

然后,我使用初始语句作为子查询获取每一天的最大值

SELECT * 
FROM 
(SELECT 
MAX(gallons) AS MaxHour,
date_local 
FROM 
(SELECT SUM(consumption) AS Gallons,
time_local,
date_local
FROM water
WHERE consumption_period = 'HOUR' AND date_local > DATEADD(day,-2, GETDATE())
GROUP BY 
time_local,
date_local) AS t1
GROUP BY date_local) AS t2

这为我提供了每天的最大加仑汽油.

gallons date_local
392,489 2023-12-18
315,744 2023-12-19

我正在解决的问题是将所有这些放在一起,这样我就可以报告每个Max值发生的‘time_local’,从而得到这样的结果.

gallons time_local date_local
392,489 2023-12-18T12:00:00 2023-12-18
315,744 2023-12-19T18:00:00 2023-12-19

我曾try 连接t1加仑=t2.max小时,但我做错了一些事情,因为系统告诉我‘t1不存在’.

推荐答案

您可以使用窗口函数来执行此操作

WITH CTE AS (
SELECT SUM(consumption) AS Gallons,
time_local,
date_local
, ROW_NUMBER() OVER (PARTITION BY date_local ORDER BY  SUM(consumption) DESC) rn
FROM water
WHERE consumption_period = 'HOUR' AND date_local > DATEADD(day,-2, GETDATE())
GROUP BY 
time_local,
date_local)
SELECT
    Gallons
    ,time_local
    ,date_local
FROM CTE 
WHERE rn = 1

Sql相关问答推荐

判断时间之间是否有时间

Oracle中的分层查询

如何查询一个名称是根据PL/pgSQL函数结果构建的表?

JSON列之间的Postgr聚合

我可以将INSERT语句与SELECT一起使用来创建条件吗?

R中对Arrow duckdb工作流的SQL查询

从自定义日期和时间开始,每月具有给定状态的公司数量

从列中提取子字符串的ORDER BY CASE语句

关于Postgres横向联接的谓词

在Netezza SQL中将字符DataType转换为整型DataType

postgres中的条件索引和触发器

同时插入和更新记录

在 PostgreSQL 中生成时间序列查询

在 postgres 中插入或更新 jsonb 数组的对象

SQL 根据前一天的最大值计算每天的值数

按所选的值将记录分组到不同的列中

批量更改WooCommerce中所有产品的税收状态

如何根据与 BigQuery 中另一个表的匹配更新一个表中的列?

我现在如何显示重复的汽车? postgresql

SQL:有没有办法根据另一列的数据细节过滤和形成另一列?