SQL wybiera wiersze według najnowszej daty

106

Korzystając z następującego zapytania i wyników, szukam najnowszego wpisu, w którym ChargeId i ChargeType są unikalne.

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

Pożądany:

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008
jgreep
źródło

Odpowiedzi:

147

Możesz użyć funkcji GROUP BY, aby pogrupować elementy według typu i identyfikatora. Następnie możesz użyć funkcji MAX () Aggregate, aby uzyskać ostatni miesiąc obsługi. Poniższe zwraca zestaw wyników z ChargeId, ChargeType i MostRecentServiceMonth

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE
Mitchel Sellers
źródło
1
Nie zapomnij o aliasie pola MAX (serviceMonth) na wypadek, gdybyś potrzebował go pod prąd.
Ben Hoffstein
2
ok, więc co się stanie, jeśli w tabeli jest wiersz 101 N 1/1/2008?
tvanfosson
3
zwrócony zostałby dodatkowy wiersz. Jaki jest pożądany wynik w oparciu o jego wymagania.
Carlton Jenke
1
Dodano alias do zapytania w poście. tvanfosson - byłby to warunek dodany do zestawu wyników, który jest poprawny.
Mitchel Sellers
1
Gdybym chciał też wyciągnąć z niego identyfikator płyty. Jak bym to zrobił?
Donny V.
58

Więc nie o to prosił requester, ale jest to odpowiedź na pytanie „SQL wybiera wiersze według najnowszej daty”.

Zmodyfikowano z 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
źródło
2
Dziękuję Ci! To jest to, czego szukałem!
Diana
Nie wydaje się być zgodny z widokami.
nuzzolilo
11
SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth 
FROM invoice
GROUP BY chargeId, chargeType
Ben Hoffstein
źródło
6

Widzę, że większość programistów używa zapytań wbudowanych bez sprawdzania ich wpływu na ogromne dane.

w prosty sposób możesz to osiągnąć poprzez:

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
źródło
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

Powyższe zapytanie zadziała, jeśli odrębny identyfikator opłaty ma różne kombinacje rodzaju opłaty. Mam nadzieję, że to proste zapytanie pomoże przy niewielkim czasie działania ...

pari elanchezhiyan
źródło