【问题标题】:Self Join a table via subquery - in the SELECT clause (Spark SQL)通过子查询自加入表 - 在 SELECT 子句中 (Spark SQL)
【发布时间】:2019-06-13 13:34:46
【问题描述】:

我有一些按以下方式格式化的数据。

IDDATE 列是表的主键。活动列表示用户是否参与了活动。

我的目标是在当前行的日期之后找到每个用户的最后一个活动日期。

所以,我想自己加入表。问题 - 我正在使用 SPARK SQL,但不能在 select 子句中使用子查询,其中包含 <> 符号。

我的想法是:

SELECT MAX(ACTIVE) from table t1, t2 where t1.ID =  t2.ID and t1.Date>t2.Date

但是,这是不可能的。

否则我该怎么做?

    +----+----------+--------+-------------+
| ID | DATE     | ACTIVE | LAST_ACTIVE |
+----+----------+--------+-------------+
|    |          |        |             |
| 1  | 06/12/19 | 0      |             |
+----+----------+--------+-------------+
| 1  | 06/13/19 | 1      |             |
+----+----------+--------+-------------+
| 1  | 06/14/19 | 0      |             |
+----+----------+--------+-------------+
| 2  | 06/12/19 | 0      |             |
+----+----------+--------+-------------+
| 2  | 06/13/19 | 1      |             |
+----+----------+--------+-------------+
| 3  | 06/12/19 | 1      |             |
+----+----------+--------+-------------+
| 3  | 06/13/19 | 0      |             |
+----+----------+--------+-------------+

【问题讨论】:

  • 请解释您要做什么。你想要什么结果?

标签: sql pyspark apache-spark-sql


【解决方案1】:

在给定日期之后活动的最后日期。 . .使用窗口函数:

select t.*,
       max(case when active = 1 then date end) over (partition by id order by date)
from t;

【讨论】:

  • 谢谢,我会试试的。
猜你喜欢
  • 1970-01-01
  • 2012-02-14
  • 2014-02-23
  • 2015-08-02
  • 1970-01-01
  • 2013-09-25
  • 2021-11-09
  • 2021-11-16
  • 2012-10-02
相关资源
最近更新 更多