SQL selecionando linhas pela data mais recente

106

Usando a consulta e os resultados a seguir, estou procurando a entrada mais recente em que ChargeId e ChargeType são exclusivos.

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

Desejado:

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

Respostas:

147

Você pode usar um GROUP BY para agrupar itens por tipo e id. Então, você pode usar a função MAX () Aggregate para obter o mês de serviço mais recente. O seguinte retorna um conjunto de resultados com ChargeId, ChargeType e MostRecentServiceMonth

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE
Vendedores Mitchel
fonte
1
Não se esqueça de criar um alias para o campo MAX (serviceMonth) caso você precise dele no downstream.
Ben Hoffstein,
2
ok, então o que acontece se houver uma linha 101 N 1/1/2008 na tabela?
tvanfosson,
3
você receberá uma linha extra retornada. Qual é o resultado desejado com base em seus requisitos.
Carlton Jenke,
1
Adicionado alias para a consulta na postagem. tvanfosson - seria uma condicional adicionada ao conjunto de resultados, o que é correto.
Mitchel Sellers,
1
Se eu quisesse também puxar o id do registro com ele. Como eu faria isso?
Donny V.
58

Portanto, não era isso que o solicitante estava pedindo, mas é a resposta para "SQL selecionando linhas pela data mais recente".

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
fonte
2
Obrigado! Isso é o que eu estava procurando!
Diana
Não parece ser compatível com visualizações.
nuzzolilo
11
SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth 
FROM invoice
GROUP BY chargeId, chargeType
Ben Hoffstein
fonte
6

Vejo que a maioria dos desenvolvedores usa consulta em linha sem olhar para o impacto sobre os dados enormes.

de forma simples, você pode conseguir isso:

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
fonte
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

A consulta acima funcionará se o id de cobrança distinto tiver diferentes combinações de chargetype. Esperamos que esta consulta simples ajude com pouco tempo de desempenho em consideração ...

pari elanchezhiyan
fonte