2008-10-09 10 views
85

En utilisant la requête et les résultats suivants, je recherche l'entrée la plus récente où ChargeId et ChargeType sont uniques.Sélection de lignes SQL par date la plus récente

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 

souhaitee:

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

Répondre

121

Vous pouvez utiliser un groupe PAR aux éléments du groupe par type et id. Ensuite, vous pouvez utiliser la fonction MAX() Agréger pour obtenir le mois de service le plus récent. Les rendements en dessous d'un jeu de résultats avec ChargeId, ChargeType et MostRecentServiceMonth

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

Il est parfait. Je vous remercie! – jgreep

+1

N'oubliez pas d'alias le champ MAX (serviceMonth) au cas où vous en auriez besoin en aval. –

+2

ok, alors que se passe-t-il s'il y a une ligne 101 N 1/1/2008 dans le tableau? – tvanfosson

6
SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth 
FROM invoice 
GROUP BY chargeId, chargeType 
41

Donc, ce n'est pas ce que le demandeur demandait, mais il est la réponse à « lignes SQL sélection par la date la plus récente ».

de Modified 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 
+0

Merci! C'est ce que je cherchais! – Diana

+0

Ne semble pas être compatible avec les vues. – Nuzzolilo

-1
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'identifiant de charge distincts a différents combinations.Hope de chargetype cette requête simple aide avec peu de temps de performance en considération ...

2

Je vois que la plupart des développeurs utilisent des requêtes en ligne sans se soucier de l'impact sur les données volumineuses.

en simple, 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 <b.serviceMonth 
where b.chargeId is null 
order by a.serviceMonth desc 
Questions connexes