SQL sélection des lignes par date la plus récente


106

À 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

Réponses:


147

Vous pouvez utiliser un GROUP BY pour regrouper les éléments par type et par identifiant. Ensuite, vous pouvez utiliser la fonction MAX () Aggregate pour obtenir le mois de service le plus récent. Ce qui suit renvoie un jeu de résultats avec ChargeId, ChargeType et MostRecentServiceMonth

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

1
N'oubliez pas d'aliaser le champ MAX (serviceMonth) au cas où vous en auriez besoin en aval.
Ben Hoffstein

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

3
vous obtiendrez une ligne supplémentaire retournée. Quel est le résultat souhaité en fonction de ses exigences.
Carlton Jenke

1
Ajout d'un alias à la requête dans la publication. tvanfosson - ce serait un conditionnel ajouté à l'ensemble de résultats, ce qui est correct.
Mitchel Sellers

1
Si je voulais également extraire l'identifiant d'enregistrement avec. Comment pourrais-je faire ça?
Donny V.

58

Ce n'est donc pas ce que le demandeur demandait, mais c'est la réponse à "SQL sélectionnant les lignes par date la plus récente".

Modifié à partir de 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

2
Je vous remercie! C'est ce que je cherchais!
Diana

Ne semble pas compatible avec les vues.
nuzzolilo

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

6

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

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

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'ID de charge distinct a différentes combinaisons de types de caractères.J'espère que cette requête simple vous aidera avec peu de temps de performance en considération ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.