web-dev-qa-db-fra.com

Trouver la valeur maximale pour chaque mois au cours des 3 derniers mois, correctement

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 
4
Emperor1951

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;)

9
Erik Darling