使用 case 语句从两个不同的表中选择数据
Posted
技术标签:
【中文标题】使用 case 语句从两个不同的表中选择数据【英文标题】:Selecting data from two different tables with case statement 【发布时间】: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,但正如我所说,您使您编写的子查询过于复杂。如果你刚刚在子查询中写了>=
,那么它本身就会给你答案——至少在其他平台上是这样。
【参考方案1】:
如果 pyspark 不允许在相关子查询中使用 >
或 >=
,只需在主查询中使用 MIN()
...
SELECT
b.bucket_dates,
MIN(t.dates) AS final_dates
FROM
buckets AS b
LEFT JOIN
tab1 AS t
ON t.dates >= b.bucket_dates
GROUP BY
b.bucket_dates
【讨论】:
非常感谢!!这么简单的解决方案,但没想到:)以上是关于使用 case 语句从两个不同的表中选择数据的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Raw 语句我可以根据列数据是不是等于另一个表从不同的表中进行选择
如何使用 Nhibernate 从连接两个具有所有 id 的表中选择只有一个不同列的多个列是 UNIQUEIDENTIFIER