SQL выбирает строки по самой последней дате

87

Используя следующий запрос и результаты, я ищу самую последнюю запись, где свойства 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
Теги:

5 ответов

123
Лучший ответ

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

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE
  • 4
    Это идеально. Спасибо!
  • 1
    Не забудьте присвоить псевдониму поле MAX (serviceMonth) на случай, если оно понадобится вниз по течению.
Показать ещё 6 комментариев
41

Так что это не то, о чем запрашивал запросчик, но это ответ на "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
  • 1
    Спасибо! Это то, что я искал!
  • 0
    Кажется, не совместимы с представлениями.
Показать ещё 1 комментарий
6
SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth 
FROM invoice
GROUP BY chargeId, chargeType
2

Я вижу, что большинство разработчиков используют встроенный запрос, не глядя на его влияние на огромные данные.

в простой форме вы можете достичь этого:

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню