Вибір рядків SQL за останньою датою


106

Використовуючи наступний запит та результати, я шукаю останню запис, де ChargeId та ChargeType є унікальними.

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

Бажано:

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

Відповіді:


147

Ви можете використовувати GROUP BY для групування елементів за типом та ідентифікатором. Тоді ви можете використовувати функцію агрегації MAX (), щоб отримати останній місяць обслуговування. Нижче повертається набір результатів із ChargeId, ChargeType та MostRecentServiceMonth

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

1
Не забувайте псевдонімувати поле MAX (serviceMonth) у випадку, якщо вам це потрібно нижче за течією.
Бен Гофштейн

2
добре, так що станеться, якщо в таблиці є рядок 101 N 1/1/2008?
tvanfosson

3
ви отримаєте додатковий рядок повернутий. Який бажаний результат виходячи з його вимог.
Карлтон Дженке

1
Доданий псевдонім до запиту. tvanfosson - це було б умовно, що додається до набору результатів, що є правильним.
Продавці Мітчела

1
Якщо я хотів також витягнути ідентифікатор запису з ним. Як би я це зробив?
Донні В.

58

Отже, про це не запитував запитувач, але це відповідь на "SQL вибір рядків за останньою датою".

Змінено з 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
Дякую! Це те, що я шукав!
Діана

Це не здається сумісним із переглядами.
nuzzolilo


6

Я бачу, що більшість розробників використовують вбудований запит, не дивлячись, що це впливає на величезні дані.

просто, ви можете досягти цього:

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

Наведений вище запит спрацює, якщо окремий ідентифікатор заряду має різні комбінації типів шрифтів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.