【问题标题】:SQL - If Max Return 'True' Else 'False'SQL - 如果最大返回“真”,否则“假”
【发布时间】:2019-03-10 07:17:31
【问题描述】:

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

如果上诉 ID 值是该产品和年份的 MAX 值,我想要完成的是让它返回“TRUE”。所以结果如下所示:

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

我使用以下方法至少找到了正确的值:

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

但这显然只返回那些值,我不能添加我需要的所有其他列。我尝试了许多不同的 CASE 语句,但似乎无法使其工作。大多数情况下我得到聚合错误。

想法?

【问题讨论】:

  • 提示:不使用图片的原因是here

标签: sql tsql subquery max case


【解决方案1】:

您可以使用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 的记录组中的最大值(appealid)。然后我们只是比较当前记录。

【讨论】:

  • 很好的答案!,只需完全删除组。
  • @Alex 不错!我删除了坏的max()group by
  • 这工作完美。感谢 JNevill。几个小时以来,我一直在为此挠头。忘记所有关于分区的事情了。
  • @JNevill,我的自动转到本来是交叉应用,但我喜欢窗口功能解决方案。知道两者之间的性能比较是什么吗?
  • @AnthonyHancock 我不确定性能。我敢打赌,除非数据真的很小,否则这会更快。结果集将首先 100% 生成,然后窗口函数才会开始播放这些结果。交叉应用似乎会纠缠于查询的复杂性(如果查询非常复杂,则交叉应用需要做更多的工作)。此窗口函数将在任何复杂性之上进行扩展,并且只会随着结果集中记录数的增长而变慢。
【解决方案2】:

您需要在子查询中分组,然后加入以查找是否为最大值:

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

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 2013-06-14
    • 1970-01-01
    • 2021-10-15
    • 2016-05-03
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多