如何在 Oracle SQL 中执行复杂的 MAX() 和 GROUP BY?

How to do a complex MAX() and GROUP BY in Oracle SQL?

我关心 2 个表 AUF_KOPF 是订单 header 和 AUF_POS 是订单项目。

我想获得产品在订单中的订单项目上使用的最长最后日期。产品 ID 存储在 AUF_POS.GLAS1AUF_POS.GLAS2AUF_POS.GLAS3.

我创建了这个只检查 AUF_POS.GLAS1:

的查询
Select Max(AUF_KOPF.ERFASS_DAT),
  AUF_POS.GLAS1
From AUF_KOPF AUF_KOPF
  Inner Join AUF_POS AUF_POS On AUF_KOPF.AUF_NR = AUF_POS.AUF_NR
Group By AUF_POS.GLAS1
Order By AUF_POS.GLAS1

结果:

MAX(AUF_KOPF.ERFASS_DAT)    GLAS1
07/11/2016  1
06/11/2016  2
03/11/2016  3
09/11/2016  4
07/11/2016  5

问题是产品 ID 1 在订单 AUF_POS.GLAS2AUF_POS.GLAS3.

的另一个位置可能比 07/11/2016 最近使用过

是否可以做到 OR,或者最好的写法是什么?我想避免拥有 3 SELECT 然后合并它们,因为这看起来很乱。

示例 AUF_KOPF 行:

AUF_NR  ERFASS_DAT
1609183 06/01/2016
1609184 06/01/2016
1609185 06/01/2016
1609187 06/01/2016
1609188 06/01/2016

示例 AUF_POS 行:

AUF_NR  AUF_POS GLAS1   GLAS2   GLAS3
1609183 4   4   9   0
1609184 5   4   9   0
1609185 6   4   9   0
1609187 7   4   9   0
1609188 8   4   9   0

此实例中的所需输出会将所有产品显示为 06/01/2016,但如果有更多数据,它将在任何位置显示使用产品 ID 的最新日期。

您可以使用 UNION ALL,它不会过于复杂(除了更长的代码)

Select Max(AUF_KOPF.ERFASS_DAT),
       AUF_POS.GLAS
From AUF_KOPF
  Inner Join (SELECT AUF_NR,GLAS1 as glas FROM AUF_POS UNION ALL
              SELECT AUF_NR,GLAS2         FROM AUF_POS UNION ALL
              SELECT AUF_NR,GLAS3         FROM AUF_POS) AUF_POS
  On AUF_KOPF.AUF_NR = AUF_POS.AUF_NR
Group By AUF_POS.GLAS
Order By AUF_POS.GLAS