正确查找过去 3 个月每个月的最大值

Emp*_*951 4 sql-server-2008 sql-server aggregate max

我有一个查询,用于获取过去 3 个月的 ID 数据。我需要调整它,以便我在三个月中的每一个月都获得最高值。我已经用聚合函数 MAX 尝试了几件事,但我一无所获。

我试图获得过去几个月中每个月的最大值......

以下是查询中的数据,目前按日期 (asc) 排序:

ID 日期值
12410 01/03/2017 12:17 0.000178
12410 01/10/2017 11:36 0.000186
12410 01/17/2017 11:27 0.000189
12410 01/24/2017 13:09 0.000182
12410 01/31/2017 10:37 0.000169
12410 02/07/2017 11:03 0.000214
12410 02/14/2017 11:52 0.000176
12410 02/21/2017 10:51 0.000200
12410 02/28/2017 12:29 0.000194
12410 03/07/2017 08:39 0.000206

这是查询:

从 AnalysisValueTbl 中选择 AnalysisID 作为“ID”,AnalysisDateTime 作为“Date”,AnalysisValue 作为“Value”
在哪里
AnalysisID = 12410 和 DatePart(m, AnalysisDateTime) = DatePart(m, DateAdd(m, -3, getdate()))
和 DatePart(yyyy, AnalysisDateTime) = DatePart(yyyy, DateAdd(m,-3, getdate()))
或者
AnalysisID = 12410 和 DatePart(m, AnalysisDateTime) = DatePart(m, DateAdd(m, -2, getdate()))
和 DatePart(yyyy, AnalysisDateTime) = DatePart(yyyy, DateAdd(m,-2, getdate()))
或者
AnalysisID = 12410 和 DatePart(m, AnalysisDateTime) = DatePart(m, DateAdd(m, -1, getdate()))
和 DatePart(yyyy, AnalysisDateTime) = DatePart(yyyy, DateAdd(m,-1, getdate()))
按 AnalysisValue desc 排序 

Eri*_*ing 9

对于 SQL Server,您可以执行以下操作。

DECLARE @t TABLE (Id INT, DateVal DATETIME, ValueVal DECIMAL(18, 9));

INSERT @t ( Id, DateVal, ValueVal )
SELECT Id, DateVal, ValueVal
FROM (
    VALUES 
    (12410,   '01/03/2017 12:17',    0.000178),
    (12410,   '01/10/2017 11:36',    0.000186),
    (12410,   '01/17/2017 11:27',    0.000189),
    (12410,   '01/24/2017 13:09',    0.000182),
    (12410,   '01/31/2017 10:37',    0.000169),
    (12410,   '02/07/2017 11:03',    0.000214),
    (12410,   '02/14/2017 11:52',    0.000176),
    (12410,   '02/21/2017 10:51',    0.000200),
    (12410,   '02/28/2017 12:29',    0.000194),
    (12410,   '03/07/2017 08:39',    0.000206)
) x (Id, DateVal, ValueVal);

SELECT  DATEPART(MONTH, t.DateVal) AS [DateVal],
        MAX(t.ValueVal) AS MaxVal
FROM @t AS t
WHERE t.DateVal >= DATEADD(MONTH, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0))
GROUP BY DATEPART(MONTH, t.DateVal);
Run Code Online (Sandbox Code Playgroud)

更新WHERE条款:展平日期很奇怪,我之前的查询让你今天的日期减去三个月。要回到三个月前的第一个,你必须转一些技巧。

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) AS [First Of This Month],
       DATEADD(MONTH, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)) AS [First Of Three Months Ago]
Run Code Online (Sandbox Code Playgroud)

您可以花一些时间尝试理解这一点,也可以将如何做的备忘单放在手边,这样您就不必记住糟糕的约会数学;)