Необходимо получить идентификатор элемента, выбранного в MAX

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть список учетных записей (сущностей), и каждая учетная запись имеет 0: n событий. (entity_event).

 Select 
    e.id,
    e.description, 
    SUM(CASE WHEN ee.source_entity_id = e.id THEN 1 ELSE -1 END * ISNULL(ee.amount,0)) AS Total, 
    MAX(ee.event_date) AS LastTransactionDate
from entity e
left join entity_event ee
on ee.source_entity_id = e.id or ee.destination_entity_id = e.id
where e.deleted is NULL
and e.portfolio_id = 79
and e.entity_type_id = 1

GROUP BY e.id, e.description
order by e.description
 

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

Что мне также нужно, так это идентификатор последней оплаченной транзакции.

Я получаю MAX(ee.event_date) — но есть ли способ получить идентификатор этого entity_event? Если на эту дату более одного события — тогда мне нужно последнее.

Или здесь нужны дополнительные запросы?

Ответ №1:

Если вы используете оконные функции вместо group by , то вы можете извлечь все остальные столбцы из записи. Вот как выглядит запрос:

 select t.*
from (Select e.id, e.description, 
             SUM(CASE WHEN ee.source_entity_id = e.id THEN 1 ELSE -1 END * ISNULL(ee.amount, 0)) OVER
                 (partition by e.id) AS Total, 
             MAX(ee.event_date) over (partition by e.id) AS LastTransactionDate,
             row_number() over (partition by e.id order by ee.event_date desc) as seqnum
      from entity e left join entity_event
           ee
           on ee.source_entity_id = e.id or ee.destination_entity_id = e.id
      where e.deleted is NULL and e.portfolio_id = 79 and e.entity_type_id = 1
     ) t
where seqnum = 1;
order by e.description;
 

Комментарии:

1. Идеально! Теперь, чтобы понять, почему это работает! Никогда не использовал Count / Sum / Max без GROUP . Теперь нужно прочитать «оконные функции». Спасибо!