SQL-如果最大返回'True'否则为'False'

时间:2018-10-04 20:13:47

标签: sql tsql subquery max case

我有一个查询,生成如下表:

Current Output

我要完成的工作是,如果上诉ID值是该产品和年份的最大值,则返回“ TRUE”。因此结果将如下所示:

Desired Output

部件ID无关紧要,但在上诉ID中会产生重复的值。

我已经使用以下内容至少找到了正确的值:

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

但是,这显然只会返回这些值,而我无法添加我需要的所有其他列。我尝试了许多不同的CASE语句,但似乎无法正常工作。通常,我会遇到聚合错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以使用window functions进行此操作:

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)

这表示要在与该记录相同的productidyear匹配的记录组中获取max(appealid)。然后,我们将其与当前记录进行比较。

答案 1 :(得分:0)

您需要对子查询进行分组,然后加入以查找最大值:

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