SQL подзапрос с агрегированным значением - PullRequest
0 голосов
/ 14 июля 2020

Извините за расплывчатое название, я здесь немного потерялся. У меня есть два простых агрегатных запроса SQL, но мне сложно объединить их функционально (вероятно, с помощью подзапроса) в IBM DB2. Основная цель - запустить функцию COUNT в таблице INVOICES, но с начальной датой, основанной на совокупном результате MAX подзапроса.

select count(a.invno), a.item from INVOICES a
where a.invdate > 20200101
group by a.item

Но, как уже отмечалось, я не хочу, чтобы a.invdate был исправлен (20200101 ). Мне нужно запустить функцию MAX в таблице SERVICE и использовать ее результат в качестве параметра для a.invdate. Есть ли разумный способ сделать это?

select max(b.servdate), b.item from SERVICE b
where b.servtype = 1
group by b.item

Итак, мы хотим подсчитать счета-фактуры по каждому элементу с момента последней даты обслуживания (в соответствии с его собственными параметрами). Очевидно, здесь a.item = b.item.

Ответы [ 3 ]

2 голосов
/ 14 июля 2020

Если я правильно следил за вами, вы можете join или использовать коррелированный подзапрос:

select count(i.invno), i.item 
from invoices i
where i.invdate > (
    select max(s.servdate) 
    from services s 
    where s.servtype = 1 and s.item = i.item
)
group by i.item

Это должен быть эффективный подход при условии, что у вас есть индекс на services(item, servtype).

В качестве альтернативы, вот подход join:

select count(i.invno), i.item 
from invoices i
inner join (
    select item, max(servdate) servdate
    from services
    where servtype = 1
    group by item
) s on s.item = i.item and s.invdate > s.servdate
group by i.item
0 голосов
/ 14 июля 2020

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

select count(i.invno), i.item 
from invoices i
join (
    select max(s.servdate) maxd, s.item
    from services s 
    where s.servtype = 1
    group by s.item
) as sub on sub.item = i.item and a.invdate > sub.maxd
group by i.item
0 голосов
/ 14 июля 2020

Думаю, ты хочешь row_number():

select s.*
from (select s.*, row_number() over (partition by item order by servdate desc) as seqnum
      from service s
      where s.servtype = 1
     ) s
where seqnum = 1;
...