#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 . Теперь нужно прочитать «оконные функции». Спасибо!