SQL - если Max возвращает «True», иначе «False» - PullRequest
0 голосов
/ 04 октября 2018

У меня есть запрос, который производит таблицу, подобную следующей:

Current Output

Я пытаюсь добиться, чтобы он возвратил «ИСТИНА», если значение идентификатора апелляции равноМАКСИМАЛЬНОЕ значение для этого Продукта и Года.Таким образом, результаты будут выглядеть следующим образом:

Desired Output

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

Я использовал следующее, чтобы хотя бы найти правильные значения:

SELECT MAX(AppealID)
    ,ProductID
    ,PartID
    ,Year
FROM (XYZ Tables with Many Joins)
    GROUP BY ProductId,Year,PartID

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

Мысли?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

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

declare @t table(product_id int, part_id int, appeal_id int, [year] int)
insert into @t values
(1,6,1,2016),
(1,7,1,2016),
(1,6,2,2017),
(1,7,2,2016),
(1,8,3,2016),
(1,8,1,2016);


select t.*, case when m.appeal_id is not null then 'TRUE' else '' end as Max_Check
from 
    @t t
    left join
    (
select MAX(appeal_id) appeal_id, product_id, [YEAR]
from 
    @t
group by product_id, [year]
) m on t.product_id = m.product_id and
t.year = m.year and
t.appeal_id = m.appeal_id
0 голосов
/ 04 октября 2018

Вы можете использовать оконные функции , чтобы сделать это:

SELECT 
    ,ProductID
    ,PartID
    ,Year
    ,CASE WHEN MAX(AppealID) OVER (PARTITION BY productid, year) = AppealID THEN 'TRUE' ELSE 'FALSE' END as MaxCheck
FROM (XYZ Tables with Many Joins)

Это говорит о том, что нужно захватить максимум (обращение) внутри группы записей, которые совпадают с productid иyear как эта запись.Тогда мы просто сравним с текущей записью.

...