Нахождение макс и количество в одном соединении
Эта проблема может иметь простое решение, но, к сожалению, я не могу понять это.
У меня есть две таблицы: таблица A и таблица B
Table A Table B
------------------- ------------------------------
Id NoOfItems Id itemNo deliveredDate
X1 3 X1 1 2017-07-01
X1 2 2017-07-02
X1 3 2017-07-03
Поэтому мне нужно добавить максимальное значение DeliveryDate каждого идентификатора в таблицу A, но только если количество доставленных элементов в таблице B равно NoOfItems в таблице A.
Пока я написал этот запрос:
SELECT *
FROM A
OUTER APPLY
(
SELECT TOP 1 *
FROM B
WHERE A.Id =B.Id
ORDER BY
B.DeliveredDate DESC
) s
where A.NoOfItems= (select count(1) from B )
)
2 ответа
Решение
У вас почти было это:
;with A as
(select 1 ID, 3 NoOfItems
union all select 2 ID, 2 NoOfItems
union all select 3 ID, 1 NoOfItems
)
, B as
(select 1 id, 1 itemno, '2017-07-01' deliveredDate
union all select 1, 2, '2017-07-02'
union all select 1, 3, '2017-07-03'
union all select 2, 1, '2017-08-02'
union all select 2, 2, '2017-08-03'
)
SELECT *
FROM A
OUTER APPLY
(
SELECT TOP 1 *
FROM B
WHERE A.Id =B.Id
ORDER BY
B.DeliveredDate DESC
) s
where A.NoOfItems = (select count(1) from B WHERE B.id = A.ID)
Я бы просто сделал это с простым join
а также group by
:
select a.*,
(case when b.cnt = a.noofitems then b.deliveredDate end)
from a join
(select b.id, count(*) as cnt, max(deliveredDate) as deliveredDate
from b
group by b.id
) b;
on a.id = b.id;
Неясно, хотите ли вы назначить дату доставки для всех строк, с NULL
значения для совпадающих (как в приведенном выше запросе). Или, если вы хотите отфильтровать несоответствующие строки (в этом случае используйте where
).