Netezza - 用另一个 table 的最大数据更新一个 table
Netezza - update one table with max data from another table
我在 netezza 中有一个 table 需要更新。我正在使用的专栏是
TABLE一个
- ID_NO
- ENTRY_DATE
- 价格
TABLE B
- ID_NO
- START_DATE
- END_DATE
- 价格
所以数据示例如下所示:
TABLE一个
ID_NO
ENTRY_DATE
价格
123
2020-05-01
123
2020-08-15
TABLE B
ID_NO
START_DATE
END_DATE
价格
123
2019-01-01
2019-11-01
7.64 美元
123
2020-04-30
2020-05-02
6.19 美元
123
2020-04-15
2020-08-30
2.19 美元
我需要将 TABLE A 中的价格更新为 TABLE B 中的最高价格,其中 a.ENTRY_DATE 介于 b.START_DATE 和 b.END_DATE 之间。所以最后的 table 应该是这样的:
TABLE一个
ID_NO
ENTRY_DATE
价格
123
2020-05-01
6.19 美元
123
2020-08-15
2.19 美元
这是我目前所拥有的,但它最终只是采用适合每一行的最高价格,而不是对每一行进行计算:
update TABLE_A
set PRICE=(select max(b.PRICE)
from TABLE_B b
inner join TABLE_A a on a.ID_NO=b.ID_NO
where a.ENTRY_DATE between b.START_DATE and b.END_DATE)
我无权访问 Netezza,但通常的格式是使用相关的子查询。
也就是说,您不再在查询中包含 TABLE_A
,而是将外部引用引用到 TABLE_A
...
update
TABLE_A
set
PRICE = (
select max(b.PRICE)
from TABLE_B b
where TABLE_A.ID_NO = b.ID_NO
and TABLE_A.ENTRY_DATE between b.START_DATE and b.END_DATE
)
通过这种方式,相关子查询实质上对 TABLE_A
中的每一行调用一次,并且该调用使用 TABLE_A
中的当前行作为其参数。
替代方案可能是...
update
TABLE_A
set
PRICE = revised.PRICE
from
(
select a.ID_NO, a.ENTRY_DATE, max(b.PRICE) AS PRICE
from TABLE_B b
inner join TABLE_A a on a.ID_NO=b.ID_NO
where a.ENTRY_DATE between b.START_DATE and b.END_DATE
group by a.ID_NO, a.ENTRY_DATE
)
AS revised
where
TABLE_A.ID_NO = revised.ID_NO
and TABLE_A.ENTRY_DATE = revised.ENTRY_DATE
我在 netezza 中有一个 table 需要更新。我正在使用的专栏是
TABLE一个
- ID_NO
- ENTRY_DATE
- 价格
TABLE B
- ID_NO
- START_DATE
- END_DATE
- 价格
所以数据示例如下所示:
TABLE一个
ID_NO | ENTRY_DATE | 价格 |
---|---|---|
123 | 2020-05-01 | |
123 | 2020-08-15 |
TABLE B
ID_NO | START_DATE | END_DATE | 价格 |
---|---|---|---|
123 | 2019-01-01 | 2019-11-01 | 7.64 美元 |
123 | 2020-04-30 | 2020-05-02 | 6.19 美元 |
123 | 2020-04-15 | 2020-08-30 | 2.19 美元 |
我需要将 TABLE A 中的价格更新为 TABLE B 中的最高价格,其中 a.ENTRY_DATE 介于 b.START_DATE 和 b.END_DATE 之间。所以最后的 table 应该是这样的:
TABLE一个
ID_NO | ENTRY_DATE | 价格 |
---|---|---|
123 | 2020-05-01 | 6.19 美元 |
123 | 2020-08-15 | 2.19 美元 |
这是我目前所拥有的,但它最终只是采用适合每一行的最高价格,而不是对每一行进行计算:
update TABLE_A
set PRICE=(select max(b.PRICE)
from TABLE_B b
inner join TABLE_A a on a.ID_NO=b.ID_NO
where a.ENTRY_DATE between b.START_DATE and b.END_DATE)
我无权访问 Netezza,但通常的格式是使用相关的子查询。
也就是说,您不再在查询中包含 TABLE_A
,而是将外部引用引用到 TABLE_A
...
update
TABLE_A
set
PRICE = (
select max(b.PRICE)
from TABLE_B b
where TABLE_A.ID_NO = b.ID_NO
and TABLE_A.ENTRY_DATE between b.START_DATE and b.END_DATE
)
通过这种方式,相关子查询实质上对 TABLE_A
中的每一行调用一次,并且该调用使用 TABLE_A
中的当前行作为其参数。
替代方案可能是...
update
TABLE_A
set
PRICE = revised.PRICE
from
(
select a.ID_NO, a.ENTRY_DATE, max(b.PRICE) AS PRICE
from TABLE_B b
inner join TABLE_A a on a.ID_NO=b.ID_NO
where a.ENTRY_DATE between b.START_DATE and b.END_DATE
group by a.ID_NO, a.ENTRY_DATE
)
AS revised
where
TABLE_A.ID_NO = revised.ID_NO
and TABLE_A.ENTRY_DATE = revised.ENTRY_DATE