首页 > 解决方案 > 使用多个连接查找最小值

问题描述

我在 BigQuery 中使用 StandardSQL,并且有 7 个表,每个表有 10 到 75 列和数千行。为简单起见,我将只使用相关的表和列来完成我想要完成的任务。

表格1

物品 描述
12341 A B C D
23451 bcda
34561 cdab
45671 dabc

表 2

子项 地点 开关 手上 订购
12345 1 3 5
12345 2 4 2
12345 3 2 4
12346 1 7 7
12346 2 1 4
12346 3 8 7
23451 1 离开 1 1
23451 2 离开 3 2
34567 1 6 0
34567 2 1 5
34568 1 2 0
34568 2 3 10
45671 2 5 1

表3

物品 子项
12341 12346
23451 23451
34561 34567
34561 34568

当前结果

物品 描述 开关 面向对象
12341 A B C D 9 11
12341 A B C D 16 18
23451 bcda 离开 4 3
34561 cdab 7 5
34561 cdab 5 10
45671 dabc 5 1

期望的结果

物品 描述 开关 面向对象
12341 A B C D 9 18
23451 bcda 离开 4 3
34561 cdab 5 5
45671 dabc 5 1

我正在寻找每个项目的最小 OH 和最小 OO 值,并且在项目 45671 的情况下,它与相同的子项目编号不对应。

为我提供当前结果表的当前代码是:

Select 
Table1.Item,
Table1.Desc,
Table2.ON_OFF,
Table2.OH,
Table2.OO
From Table1
Left Join Table3
On Table1.Item = Table3.Item
Left Join 
    (Select SubItem, ON_OFF, Sum(OnHand) As OH, Sum(OnOrder) As OO
        From Table 2
        Group by 1,2)
ON Table3.SubItem = Table2.SubItem;

寻找想法,因为我对 SQL 还很陌生,当前的实际代码将 7 个表与各种连接联系起来,以构建一个包含 45 列和数千行的最终表。我看过使用 RowNumber() 和 Partition By,但我不确定它会去哪里。还考虑将 OO 和 OH 分成两个连接可能会有所帮助。

欢迎任何建议!谢谢!

标签: sqlgoogle-bigqueryleft-joinminimum

解决方案


在获得了一些急需的睡眠后,我开始使用它......

我想出了下面的,它正在工作!

SELECT T1.Item, 
 T1.Desc,
 T3_1.ONOFF, 
 T3_1.OH,
 T3_2.OO
 FROM Table1 T1

 Left Join
    (Select Item, SubItem,T2_1.O_O as ONOFF, T2_1.OH1 as OH,
    ROW_NUMBER() OVER(PARTITION BY Item ORDER BY T2_1.OH1) as rn
    FROM T2_1
    Left Join
      (Select SubItem, SUM(IFNULL(OnHand,0)) AS OH1,
      FROM  Table2 
      GROUP BY 1) T2_1
    ON T2_1.SubItem = T3_1.SubItem) T3_1
  On T1.Item = T3_1.Item
  
 Left Join
    (Select Item, SubItem, T2_2.OO1 as OO,
    ROW_NUMBER() OVER(PARTITION BY Item ORDER BY T2_2.OO1) as rn2
    FROM T2_2
    Left Join
      (Select SubItem, SUM(IFNULL(OnOrder,0)) AS OO1,
      FROM  Table2 
      GROUP BY 1) T2_2
    ON T2_2.SubItem = T3_2.SubItem) T3_2
  On T1.Item = T3_2.Item
 
 Where rn = 1 and rn2 = 1;

谢谢!


推荐阅读