join - 雪花:加入具有有效日期和旧记录的表显示为 NULL
问题描述
概括:
在雪花中,我有一个表,它记录了每隔一段时间更改一次的项目的最大数量。我希望能够加入该日期(有效日期)的最大项目数。这是最基本的“示例”,因为我的表格中的项目在被删除时会“过期”。
CREATE OR REPLACE TABLE ITEM
(
Item VARCHAR(10),
Quantity Number(5,0),
EFFECTIVE_DATE DATE
)
;
CREATE OR REPLACE TABLE REPORT
(
INVOICE_DATE DATE,
ITEM VARCHAR(10)
)
;
INSERT INTO REPORT
VALUES
('2021-02-01', '100'),
('2021-09-10', '100')
;
INSERT INTO ITEM
VALUES
('100', '10', '2021-01-01'),
('101', '15', '2021-01-01'),
('100', '5', '2021-09-01')
;
SELECT * FROM REPORT t1
LEFT JOIN
(
SELECT * FROM ITEM
QUALIFY ROW_NUMBER() OVER (PARTITION BY ITEM ORDER BY EFFECTIVE_DATE desc) = 1
) t2 on t1.ITEM = t2.ITEM AND t1.INVOICE_DATE <= t2.EFFECTIVE_DATE
;
退货
INVOICE_DATE,ITEM,ITEM,QUANTITY,EFFECTIVE_DATE
2021-02-01,100,100,5,2021-09-01
2021-09-10,100,NULL,NULL,NULL
我该如何解决这个问题,以便我不再在我的加入中获得 NULL 条目。谢谢您阅读此篇!
我希望得到这样的结果
INVOICE_DATE,ITEM,ITEM,QUANTITY,EFFECTIVE_DATE
2021-02-01,100,100,10,2021-01-01
2021-09-10,100,100,5,2021-09-01
解决方案
问题在于您的数据和您的期望。您的查询是这样的:
SELECT * FROM REPORT t1
LEFT JOIN
(
SELECT * FROM ITEM
QUALIFY ROW_NUMBER() OVER (PARTITION BY ITEM ORDER BY EFFECTIVE_DATE desc) = 1
) t2 on t1.ITEM = t2.ITEM AND t1.INVOICE_DATE <= t2.EFFECTIVE_DATE
;
这要求 INVOICE_DATE 小于或等于项目的有效日期。但是,情况并非如此。 2021-09-10
大于2021-09-01
所以你不会得到连接命中,这就是你得到 NULL 的原因。这也是为什么您的其他记录返回的信息不符合您的预期。
推荐阅读
- c# - ASP.NET Core 2.0 Identity 将主键从字符串修改为 Guid
- reactjs - 可以在 componentDidUpdate() 上调度更新商店的操作吗?
- java - 如何避免重复相同的代码块?
- html - HTML,CSS — 如何将两个表格并排水平居中
- html - 背景图像未出现在元素中
- python - 使用从 csv 文件创建的 pandas 数据框时出现 KeyError 问题
- json - Postgres 无法将类型 jsonb 转换为整数
- ios - 何时使用 Core Data 为应用程序创建/更新/委托 Spotlight 索引
- r - 在 dplyr 流中引用当前 data.frame
- python - Python中赋值运算符的多个目标?