SQL分组。如何在连接时选择具有最高列值的行。请不要CTE

时间:2016-10-04 21:03:07

标签: sql db2 greatest-n-per-group

我一直在撞墙,因为我觉得应该很简单,但却无法开始工作。

当我加入表A和表B时,我正在尝试检索具有最高multi_flag值的行但是我似乎无法使SQL正确,因为它返回所有行而不是具有最高 multi_flag值的那个。

这是我的表......

表A

enter image description here

表B

enter image description here

这几乎是我想要的结果,但如果我遗漏value_id行>

SELECT CATALOG, VENDOR_CODE, INVLINK, NAME_ID, MAX(multi_flag) AS multiflag 
FROM TBLINVENT_ATTRIBUTE AS A
INNER JOIN TBLATTRIBUTE_VALUE AS B 
ON A.VALUE_ID = B.VALUE_ID
GROUP BY CATALOG, VENDOR_CODE, INVLINK, NAME_ID
ORDER BY CATALOG DESC

enter image description here

这与我想要撤消的内容很接近,但并不完全注意它如何返回唯一name_id和最高multi_flag,但我还需要属于value_id的{​​{1}} } / multi_flag分组...

如果我在我的SQL语句中包含value_id,那么它将返回所有行并且不再分组

注意以下结果如何不再返回最高name_id的行以及如何返回multi_flag(例如name_id 1)的所有不同值

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以选择使用子查询,派生表或CTE来解决此问题。性能取决于您查询的数据量。要实现获取max multiflag的目标,必须首先根据要实现的分组获取最大值,然后才能使用CTE或子查询。下面的CTE将给出max multi_flag值,您可以使用它来获取max multi_flag,然后您可以使用它来连接回其他表。我在这个例子中有三个连接,但这可以减少,并且就性能而言,使用子查询可能更好,但是你需要知道,直到你得到实际的执行计划并排。

; high_multi_flag为  (   select value_id,max(multi_flag)AS multiflag   来自TBLINVENT_ATTRIBUTE   按value_id分组  )   选择A.CATALOG,a.VENDOR_CODE,a.INVLINK,b.NAME_ID,m.multiflag  来自highest_multi_flag m  内联接TBLINVENT_ATTRIBUTE作为a.VALUE_ID = b。 m.VALUE_ID INNER JOIN TBLATTRIBUTE_VALUE作为B ON m.VALUE_ID = B.VALUE

答案 1 :(得分:0)

您也可以使用Lateral,这是另一种解决方案

  SELECT 
  A.CATALOG, A.VENDOR_CODE, A.INVLINK, B.NAME_ID, M.maxmultiflag 
  FROM TBLINVENT_ATTRIBUTE AS A
  inner join lateral
  (
   select max(B.multi_flag) as maxmultiflag from TBLINVENT_ATTRIBUTE C
   where A.VALUE_ID = C.VALUE_ID
  ) M on 1=1
  INNER JOIN TBLATTRIBUTE_VALUE AS B ON M.maxmultiflag = B.VALUE