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 () Aggregate, чтобы получить последний месяц обслуживания. Ниже приводится набор результатов с 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
Спасибо! Это то, что я искал!
Diana

Кажется, несовместимо с представлениями.
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

Вышеупомянутый запрос будет работать, если отдельный идентификатор заряда имеет разные комбинации chargetype. Надеюсь, этот простой запрос поможет с меньшим временем производительности ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.