SQL выбирает строки по самой последней дате - PullRequest
93 голосов
/ 10 октября 2008

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

134 голосов
/ 10 октября 2008

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

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE
49 голосов
/ 10 октября 2008

Так что это не то, о чем просил запрашивающий, а ответ «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
8 голосов
/ 10 октября 2008
SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth 
FROM invoice
GROUP BY chargeId, chargeType
2 голосов
/ 18 августа 2016

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

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

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
0 голосов
/ 30 июня 2016
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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...