SQL seleccionando filas por fecha más reciente

106

Usando la siguiente consulta y resultados, estoy buscando la entrada más reciente donde ChargeId y ChargeType son únicos.

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

Deseado:

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

Respuestas:

147

Puede utilizar GROUP BY para agrupar elementos por tipo e id. Luego, puede usar la función MAX () Aggregate para obtener el mes de servicio más reciente. Lo siguiente devuelve un conjunto de resultados con ChargeId, ChargeType y MostRecentServiceMonth

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE
Vendedores de Mitchel
fuente
1
No olvide asignar un alias al campo MAX (serviceMonth) en caso de que lo necesite en sentido descendente.
Ben Hoffstein
2
bien, ¿qué sucede si hay una fila 101 N 1/1/2008 en la tabla?
tvanfosson
3
obtendría una fila extra devuelta. Cuál es el resultado deseado en función de sus requisitos.
Carlton Jenke
1
Se agregó un alias a la consulta en la publicación. tvanfosson: ese sería un condicional que se agregó al conjunto de resultados, lo cual es correcto.
Mitchel Sellers
1
Si quisiera también extraer la identificación del registro. ¿Como podría hacerlo?
Donny V.
58

Así que esto no es lo que el solicitante estaba pidiendo, pero es la respuesta a "SQL seleccionando filas por fecha más reciente".

Modificado 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
tvanfosson
fuente
2
¡Gracias! ¡Esto es lo que estaba buscando!
Diana
No parece ser compatible con las vistas.
nuzzolilo
11
SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth 
FROM invoice
GROUP BY chargeId, chargeType
Ben Hoffstein
fuente
6

Veo que la mayoría de los desarrolladores utilizan consultas en línea sin tener en cuenta su impacto en datos enormes.

en simple, puede lograr esto mediante:

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
sujeet
fuente
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 consulta anterior funcionará si el ID de cargo distinto tiene diferentes combinaciones de tipo de cargo. Espero que esta consulta simple ayude con poco tiempo de rendimiento en consideración ...

pari elanchezhiyan
fuente