SQL en sélectionnant les lignes par date la plus récente

À l’aide de la requête et des résultats suivants, je recherche l’entrée la plus récente dans laquelle ChargeId et ChargeType sont uniques.

select chargeId, chargeType, serviceMonth from invoice CHARGEID CHARGETYPE SERVICEMONTH 1 101 R 8/1/2008 2 161 N 2/1/2008 3 101 R 2/1/2008 4 101 R 3/1/2008 5 101 R 4/1/2008 6 101 R 5/1/2008 7 101 R 6/1/2008 8 101 R 7/1/2008 

Voulu:

  CHARGEID CHARGETYPE SERVICEMONTH 1 101 R 8/1/2008 2 161 N 2/1/2008 

Vous pouvez utiliser un GROUP BY pour regrouper les éléments par type et par identifiant. Vous pouvez ensuite utiliser la fonction MAX () Aggregate pour obtenir le mois de service le plus récent. Le ci-dessous renvoie un jeu de résultats avec ChargeId, ChargeType et MostRecentServiceMonth

 SELECT CHARGEID, CHARGETYPE, MAX(SERVICEMONTH) AS "MostRecentServiceMonth" FROM INVOICE GROUP BY CHARGEID, CHARGETYPE 

Donc, ce n’est pas ce que le demandeur demandait, mais c’est la réponse à “SQL en sélectionnant les lignes par date la plus récente”.

Modifié depuis http://wiki.lessthandot.com/index.php/Returning_The_Maximum_Value_For_A_Row

 SELECT t.chargeId, t.chargeType, t.serviceMonth FROM( SELECT chargeId,MAX(serviceMonth) AS serviceMonth FROM invoice GROUP BY chargeId) x JOIN invoice t ON x.chargeId =t.chargeId AND x.serviceMonth = t.serviceMonth 
 SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth FROM invoice GROUP BY chargeId, chargeType 

Je vois que la plupart des développeurs utilisent une requête en ligne sans regarder son impact sur des données volumineuses.

en toute simplicité, vous pouvez y parvenir en:

 select a.chargeId, a.chargeType, a.serviceMonth from invoice a left outer join invoice b on a.chargeId=b.chargeId and a.serviceMonth  
 select to.chargeid,t0.po,i.chargetype from invoice i inner join (select chargeid,max(servicemonth)po from invoice group by chargeid)t0 on i.chargeid=t0.chargeid 

La requête ci-dessus fonctionnera si l’identificateur de charge distinct a des combinaisons de types de caractères différentes.