2 votes

Requête SQL pour trier des données par heure et date et ensuite sélectionner seulement l'enregistrement le plus récent

J'essaie de créer une requête qui triera les données par date et heure, trouvera l'enregistrement le plus récent et mettra à jour un autre champ de l'enregistrement en l'indiquant comme tel.

Prenez ma vie plus dure : l'heure et les données sont deux champs séparés et l'heure est aussi une chaîne de caractères.

Voici donc ce que j'ai jusqu'à présent,

UPDATE server.ESCC_HWAY_ASSETS_GULLIES_N 
set CURRENT_REC = 'Y' 
From server.ESCC_HWAY_ASSETS_GULLIES_N A 
inner join ( 
SELECT GULLY_ID, Max([DATE]) AS MaxDate, MAX([TIME]) AS MaxTime 
FROM server.ESCC_HWAY_ASSETS_GULLIES_N B
GROUP BY GULLY_ID, [DATE] ) B 
on A.GULLY_ID = B.GULLY_ID and A.[DATE] = B.MaxDate and A.[TIME] = B.MaxTime

Il en résulte des données triées par heure et par date, mais qui mettent à jour tous les champs qu'elles trouvent, sauf aux dates où il y a deux entrées. Dans ce cas, il ne met à jour que l'enregistrement le plus récent.

Je fais des essais sur un seul enregistrement - B47605 qui donne les résultats suivants sur cette file d'attente

SELECT GULLY_ID, Max([DATE]) AS MaxDate, MAX([TIME]) AS MaxTime 
FROM ESMAPADMIN.ESCC_HWAY_ASSETS_GULLIES_N B
WHERE GULLY_ID = 'B47605'
GROUP BY GULLY_ID, [DATE]

Gully_ID     MaxDate                MaxTime
B47605  2008-03-12 00:00:00.000 09:02:29
B47605  2008-09-19 00:00:00.000 09:51:14
B47605  2009-02-16 00:00:00.000 11:18:28
B47605  2009-08-21 00:00:00.000 12:34:45
B47605  2010-03-16 00:00:00.000 09:22:26
B47605  2010-08-25 00:00:00.000 11:19:55
B47605  2011-03-07 00:00:00.000 12:19:56
B47605  2012-05-02 00:00:00.000 20:57:54

Le résultat que j'aimerais obtenir est que seul l'enregistrement le plus récent soit retourné, donc -

Gully_ID     MaxDate                MaxTime
B47605  2012-05-02 00:00:00.000 20:57:54

Je ne sais pas comment passer de l'endroit où je suis à celui où je dois être, alors toute aide serait appréciée.

2voto

John Woo Points 132738

En supposant que vous utilisez SQL Server 2005+ ( en raison de la [] Je vois. )

;WITH latestResult
AS
(
    SELECT Gully_ID, MaxDate, MaxTime,
            ROW_NUMBER() OVER (PARTITION BY Gully_ID
                                ORDER BY MaxDate DESC, MaxTime DESC) RN
    FROM tableName
)
SELECT Gully_ID, MaxDate, MaxTime
FROM latestResult
WHERE RN = 1

0voto

monkeylumps Points 379

J'ai fini par utiliser ce qui suit, merci à tous ceux qui m'ont aidé.

UPDATE ....
set CURRENT_REC = 'Y' 
where [objectID] in
(
select [objectID] from
    (
    SELECT [objectID],[GULLY_ID], [date], [time],
    ROW_NUMBER() over (partition by gully_id order by date desc, time desc) rown
    FROM ....
    ) as t
where rown=1
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X