J'ai une requête en cours qui obtient des données pour un ID pour les 3 derniers mois. J'ai besoin de l'ajuster afin d'obtenir la valeur la plus élevée pour chacun des trois mois. J'ai essayé quelques choses avec la fonction d'agrégation MAX, mais je ne vais nulle part.
J'essaie d'obtenir la valeur maximale pour chacun des derniers mois ....
Voici les données de la requête, actuellement triées par date (asc):
ID Date Valeur 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 24/01/2017 13:09 0.000182 12410 31/01/2017 10:37 0.000169 12410 02/07/2017 11:03 0.000214 12410 14/02/2017 11:52 0.000176 12410 21/02/2017 10:51 0.000200 12410 28/02/2017 12:29 0.000194 12410 03/07/2017 08:39 0.000206
Voici la requête:
sélectionnez AnalysisID comme "ID", AnalysisDateTime comme "Date", AnalysisValue comme "Value" dans AnalysisValueTbl où AnalysisID = 12410 et DatePart (m, AnalysisDateTime) = DatePart (m , DateAdd (m, -3, getdate ())) Et DatePart (yyyy, AnalysisDateTime) = DatePart (yyyy, DateAdd (m, -3, getdate ())) Ou AnalysisID = 12410 et DatePart (m, AnalysisDateTime) = DatePart (m, DateAdd (m, -2, getdate ())) Et DatePart (yyyy, AnalysisDateTime) = DatePart (yyyy, DateAdd (m , -2, getdate ())) Ou AnalysisID = 12410 et DatePart (m, AnalysisDateTime) = DatePart (m, DateAdd (m, -1, getdate ())) et DatePart (aaaa, AnalysisDateTime) = DatePart (aaaa, DateAdd (m, -1, getdate ())) ordre par AnalysisValue desc
Pour SQL Server, vous pouvez faire quelque chose comme ça.
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);
Clause WHERE
mise à jour: l'aplatissement des dates est bizarre, et ma requête précédente vous a donné la date d'aujourd'hui moins trois mois. Pour revenir au premier des trois derniers mois, vous devez tourner quelques tours.
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]
Vous pouvez soit prendre un certain temps à essayer de comprendre cela, soit garder une feuille de triche sur la façon de le faire à portée de main afin que vous n'ayez pas à vous souvenir des horribles calculs de date;)