使用多个连接查找最小值
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;
谢谢!
【讨论】:
如果您真的认为您的答案有效 - 请仔细检查 - 您可能有一些拼写错误 - 请改正!以上是关于使用多个连接查找最小值的主要内容,如果未能解决你的问题,请参考以下文章