【发布时间】: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值。
标签: sql google-bigquery left-join minimum