查询GROUP BY,其最大值为值

时间:2018-05-08 23:02:43

标签: sql sql-server-2012 group-by max min

我必须查询按小时或天分组的样本表,并使用AVG,Max得到结果,其中最大值的日期与最小值相同。这张桌子很大,所以我需要最好的表现。
表:

CREATE TABLE Samples (
[Id]                INT  IDENTITY (1, 1) NOT NULL,
[AvgValue]          FLOAT       NULL,
[SampleDate]        DATETIME      NOT NULL,
[MaxValue]          FLOAT NULL,    
[DT_MaxValue]       DATETIME NULL,
[MinValue]          FLOAT     NULL,
[DT_MinValue]       DATETIME      NULL
);

表中的行:

Id  AvgValue    SampleDate          MaxValue    DT_MaxValue         MinValue    DT_MinValue
1   10          2018-01-01T01:00:00 15          2018-01-01T01:02:00 9           2018-01-01T01:08:00
2   15          2018-01-01T01:15:00 18          2018-01-01T01:22:00 10          2018-01-01T01:16:00
3   17          2018-01-01T02:15:00 19          2018-01-01T02:27:00 12          2018-01-01T02:17:00
4   20          2018-01-01T02:30:00 23          2018-01-01T02:42:00 14          2018-01-01T02:34:00
5   22          2018-01-01T02:45:00 24          2018-01-01T02:52:00 18          2018-01-01T02:46:00
6   25          2018-01-01T03:00:00 27          2018-01-01T03:14:00 22          2018-01-01T03:01:00

预期结果:

AvgValue    SampleDate          MaxValue    DT_MaxValue         MinValue    DT_MinValue
12,5        2018-01-01T01:00:00 18          2018-01-01T01:22:00 9           2018-01-01T01:08:00
19,66       2018-01-01T02:00:00 24          2018-01-01T02:52:00 12          2018-01-01T02:17:00
25          2018-01-01T03:00:00 27          2018-01-01T03:14:00 22          2018-01-01T03:01:00

困难的部分是将日期与最大值和最小值相关联。我无法更改表格,但可以创建视图。

更新

数据来自远程系统,该系统每隔几个SECONDS对数据进行采样,并以15分钟的间隔计算Avg,读取的最大值(采样时的日期时间)和间隔的最小值(也包括日期时间) 。 " SampleDate"是间隔开始的日期时间。

我想要的是以更长的间隔(小时,天,月)查询表格和分组,但保留最大值及其时间,以及最小时间。

"按小时分组"我的意思是想要获得每个日期每小时的值,这是" 2018-01-01T01:00:00"与" 2018-01-01T01:00:00"

不同

我希望这有助于澄清问题

1 个答案:

答案 0 :(得分:0)

您的代码看起来像SQL Server。要在白天获得摘要:

SELECT CAST(SampleDate as date),
       AVG( AvgValue ) AS AvgValue,
       MAX( Maxvalue ) AS MaxValue,
       MAX( DT_MaxValue ) AS DT_MaxValue
FROM t
GROUP BY CAST(SampleDate as date);

按小时获取样本的最简单方法是包括小时:

SELECT CAST(SampleDate as date), DATEPART(HOUR, SampleDate),
       AVG( AvgValue ) AS AvgValue,
       MAX( Maxvalue ) AS MaxValue,
       MAX( DT_MaxValue ) AS DT_MaxValue
FROM t
GROUP BY CAST(SampleDate as date),  DATEPART(HOUR, SampleDate);