SQL selezionando le righe in base alla data più recente


106

Utilizzando la query ei risultati seguenti, cerco la voce più recente in cui ChargeId e ChargeType sono univoci.

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

desiderata:

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

Risposte:


147

Puoi utilizzare un GROUP BY per raggruppare gli elementi per tipo e ID. Quindi è possibile utilizzare la funzione MAX () Aggregate per ottenere il mese di servizio più recente. Quanto segue restituisce un set di risultati con ChargeId, ChargeType e MostRecentServiceMonth

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

1
Non dimenticare di alias il campo MAX (serviceMonth) nel caso in cui ne hai bisogno a valle.
Ben Hoffstein,

2
ok, allora cosa succede se c'è una riga 101 N 1/1/2008 nella tabella?
tvanfosson

3
riceverai una riga in più restituita. Qual è il risultato desiderato in base alle sue esigenze.
Carlton Jenke,

1
Aggiunto alias alla query in post. tvanfosson: sarebbe un condizionale aggiunto al set di risultati, che è corretto.
Mitchel Sellers

1
Se volessi estrarre anche l'ID del record. Come potrei farlo?
Donny V.

58

Quindi questo non è ciò che il richiedente stava chiedendo, ma è la risposta a "SQL che seleziona le righe entro la data più recente".

Modificato da 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
Grazie! Questo è quello che stavo cercando!
Diana

Non sembra essere compatibile con le visualizzazioni.
nuzzolilo

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

6

Vedo che la maggior parte degli sviluppatori utilizza la query inline senza badare al suo impatto su dati enormi.

in modo semplice puoi ottenere questo risultato:

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 query di cui sopra funzionerà se l'ID di addebito distinto ha diverse combinazioni di tipi di carattere.Spero che questa semplice query aiuti con poco tempo in considerazione ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.