sql - 使用多个连接查找最小值
问题描述
我在 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 分成两个连接可能会有所帮助。
欢迎任何建议!谢谢!
解决方案
在获得了一些急需的睡眠后,我开始使用它......
我想出了下面的,它正在工作!
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;
谢谢!
推荐阅读
- java - 正则表达式中的Java减号和hypen差异
- flutter - 颤振布局问题
- spring-boot - 合并两个分布式异步任务结果并触发一个动作
- c# - EF Core 使用 Fluent API 按类型配置实体属性
- php - dompdf在完整的bodytag中放置相同的字体
- cocoapods - 我在安装 cocoapods 时遇到了这个错误
- r - 逻辑回归 - eval(family$initialize):y 值必须为 0 <= y <= 1
- python - 反向级联规则不会影响 mongoengine 对象的覆盖删除方法
- mysql - 无法修改 MySQL 表中的列
- javascript - 如何在不指定在 digitalocean 上的 ubuntu 中运行的 REST API 端口的情况下发送 ajax 请求?