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 排序
对于 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)
您可以花一些时间尝试理解这一点,也可以将如何做的备忘单放在手边,这样您就不必记住糟糕的约会数学;)
归档时间: |
|
查看次数: |
15449 次 |
最近记录: |