使用多个连接查找最小值

Posted

技术标签:

【中文标题】使用多个连接查找最小值【英文标题】:Finding Minimum Values with Multiple Joins 【发布时间】:2021-04-14 18:53:24 【问题描述】:

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

表 1

Item Desc
12341 abcd
23451 bcda
34561 cdab
45671 dabc

表 2

SubItem Location ON_OFF OnHand OnOrder
12345 1 ON 3 5
12345 2 ON 4 2
12345 3 ON 2 4
12346 1 ON 7 7
12346 2 ON 1 4
12346 3 ON 8 7
23451 1 OFF 1 1
23451 2 OFF 3 2
34567 1 ON 6 0
34567 2 ON 1 5
34568 1 ON 2 0
34568 2 ON 3 10
45671 2 ON 5 1

表 3

Item SubItem
12341 12346
23451 23451
34561 34567
34561 34568

当前结果

Item Desc ON_OFF OH OO
12341 abcd ON 9 11
12341 abcd ON 16 18
23451 bcda OFF 4 3
34561 cdab ON 7 5
34561 cdab ON 5 10
45671 dabc ON 5 1

想要的结果

Item Desc ON_OFF OH OO
12341 abcd ON 9 18
23451 bcda OFF 4 3
34561 cdab ON 5 5
45671 dabc ON 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 分成两个连接可能会有所帮助。

欢迎提出任何建议!谢谢!

【问题讨论】:

您的问题陈述和结果不匹配。 “18”不是第一项的最小OO值。 【参考方案1】:

查看您的示例数据,您似乎可以使用group by 和聚合函数min,如下所示:

Select Table1.Item,
       Table1.Desc,
       Table2.ON_OFF,
       Min(Table2.OH),
       Min(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 Table2
              Group by 1,2) Table2
    ON Table3.SubItem = Table2.SubItem
Group by Table1.Item, Table1.Desc, Table2.ON_OFF;

【讨论】:

【参考方案2】:

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

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

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;

谢谢!

【讨论】:

如果您真的认为您的答案有效 - 请仔细检查 - 您可能有一些拼写错误 - 请改正!

以上是关于使用多个连接查找最小值的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中的数组中查找多个最小值的索引

在python中跨多个列表查找列的最小值

使用聚合和查找 mongodb 从对象数组中获取最小值

使用聚合和查找 mongodb 从对象数组中获取最小值

在数组中查找局部最小值

查找每行的最小值和最大值,不包括 NaN 值