【发布时间】:2021-12-15 05:15:40
【问题描述】:
我有 2 张桌子。
tab1:
| dates. |
|---|
| 2021-09-30 |
| 2021-10-01 |
| 2021-10-02 |
| 2021-10-04 |
| 2021-11-15 |
桶:
| bucket_dates |
|---|
| 2021-10-01. |
| 2021-10-02. |
| 2021-10-03. |
| 2021-11-03. |
我想加入这两个表以获得如下所示的最终结果。 (如果有匹配的日期,那么它将匹配,如果没有匹配的日期,那么它应该从 tab1 表中读取下一个最高的日期。例如 2021-10-03 和 2021-11-03 日期。
结果表:
| bucket_dates | final_dates |
|---|---|
| 2021-10-01. | 2021-10-01 |
| 2021-10-02. | 2021-10-02 |
| 2021-10-03. | 2021-10-04 |
| 2021-11-03. | 2021-11-15 |
我尝试通过使用连接查询来做到这一点
select a.bucket_dates,
case when b.dates is null then (select min(c.dates) from tab1 c where c.dates > a.bucket_dates)
else b.dates end as final_dates
from buckets a left join tab1 b
on a.bucket_dates = b.dates;
但此查询给出以下错误
Correlated column is not allowed in a non-equality predicate
任何建议都会很有帮助。
【问题讨论】:
-
只使用大于或等于的子查询。那么 case 和 join 就不需要了。
-
@MatBaillie 回答有效.. 但你能给出一些关于我们如何使用子查询来做到这一点的小提示吗?
-
我最初认为问题与在 case 表达式中使用子查询有关。这可能不适用于 pyspark,但正如我所说,您使您编写的子查询过于复杂。如果你刚刚在子查询中写了
>=,那么它本身就会给你答案——至少在其他平台上是这样。