在 where 子句中使用子查询 select 来自 table 的第二高日期
Using a subquery in the where clause to select 2nd highest date from a table
我需要做(伪代码)
where yyyy_mm_dd >= '2019-02-01'
and yyyy_mm_dd <= second highest date in a table
为此,我使用了以下代码:
where
p.yyyy_mm_dd >= "2019-02-02"
and p.yyyy_mm_dd <= (select max(yyyy_mm_dd) from schema.table1 where yyyy_mm_dd < (select max(yyyy_mm_dd) from schema.table1 where yyyy_mm_dd is not null))
以上内容在 spark.sql()
中时有效,但是当我 运行 没有 Spark 的查询时,即作为原始 HQL,我 运行 进入此错误:
Error while compiling statement: FAILED: ParseException line 102:25 cannot recognize input near 'select' 'max' '(' in expression specification
我试图通过为子查询中的所有列添加别名来修复它,如下所示:
where
p.yyyy_mm_dd >= "2019-02-02"
and p.yyyy_mm_dd <= (select max(t1.yyyy_mm_dd) from schema.table1 t1 where t1.yyyy_mm_dd < (select max(t2.yyyy_mm_dd) from schema.table2 t2 where t2.yyyy_mm_dd is not null))
尽管如此,我还是运行陷入同样的错误。
编辑以包含示例数据和查询:
table1:
| yyyy_mm_dd | company_id | account_manager |
|------------|------------|-----------------|
| 2020-11-10 | 321 | Peter |
| 2020-11-09 | 632 | John |
| 2020-11-08 | 598 | Doe |
| 2020-11-07 | 104 | Bob |
| ... | ... | ... |
| ... | ... | ... |
table2:
| yyyy_mm_dd | company_id | tier |
|-------------------|------------|--------|
| 2020-11-10 | 321 | Bronze |
| 2020-11-09 | 632 | Silver |
| 2020-11-08 | 598 | Gold |
| 2020-11-07 | 104 | Bob |
| ... | ... | ... |
| ... | ... | ... |
| 2019_12_13_backup | 321 | Bronze |
| 2019_12_13_backup | 632 | Silver |
| ... | | |
查询:
select
p.yyyy_mm_dd,
p.company_id,
p.account_manager,
t.tier
from
table1 p
left join(
select
yyyy_mm_dd,
company_id,
max(tier) as tier
from
table2
where
yyyy_mm_dd >= "2019-02-02"
group by
1,2
) t on (t.company_id = p.company_id and t.yyyy_mm_dd = p.yyyy_mm_dd)
where
p.yyyy_mm_dd >= "2019-02-02"
and p.yyyy_mm_dd <= (select max(yyyy_mm_dd) from table2 where yyyy_mm_dd < (select max(yyyy_mm_dd) from table2 where yyyy_mm_dd is not null))
由于 table2
在 yyyy_mm_dd
列中包含 backup_2019_12_31
,因此在 table 上执行 max()
时将返回这些行。所以我需要获得第二高的值,从此处的数据集中将是 2020-11-10
。每个 yyyy_mm_dd
.
有多个 company_ids
本质上,我想查询 table1
,其中 yyyy_mm_dd
介于 table1
起点(硬编码为 2019-02-02
)和 [=19 的真实最大日期之间=]
要从 table3 中获取第二高的日期,您可以使用 dense_rank。具有第二高日期的所有行都将被分配 rn=2。使用 LIMIT 获取单行或使用 max() 或相同的不同聚合,然后将 table 与 max_date 和过滤器交叉连接。
with max_date as(
select yyyy_mm_dd
from
(
select yyyy_mm_dd,
dense_rank() over(order by yyyy_mm_dd desc) rn
from table2
)s
where rn=2 --second max date
limit 1 --need only one record
)
select t1.*
from table1 t1
cross join max_date t2
where t1.yyyy_mm_dd <= t2.yyyy_mm_dd
我需要做(伪代码)
where yyyy_mm_dd >= '2019-02-01'
and yyyy_mm_dd <= second highest date in a table
为此,我使用了以下代码:
where
p.yyyy_mm_dd >= "2019-02-02"
and p.yyyy_mm_dd <= (select max(yyyy_mm_dd) from schema.table1 where yyyy_mm_dd < (select max(yyyy_mm_dd) from schema.table1 where yyyy_mm_dd is not null))
以上内容在 spark.sql()
中时有效,但是当我 运行 没有 Spark 的查询时,即作为原始 HQL,我 运行 进入此错误:
Error while compiling statement: FAILED: ParseException line 102:25 cannot recognize input near 'select' 'max' '(' in expression specification
我试图通过为子查询中的所有列添加别名来修复它,如下所示:
where
p.yyyy_mm_dd >= "2019-02-02"
and p.yyyy_mm_dd <= (select max(t1.yyyy_mm_dd) from schema.table1 t1 where t1.yyyy_mm_dd < (select max(t2.yyyy_mm_dd) from schema.table2 t2 where t2.yyyy_mm_dd is not null))
尽管如此,我还是运行陷入同样的错误。
编辑以包含示例数据和查询:
table1:
| yyyy_mm_dd | company_id | account_manager |
|------------|------------|-----------------|
| 2020-11-10 | 321 | Peter |
| 2020-11-09 | 632 | John |
| 2020-11-08 | 598 | Doe |
| 2020-11-07 | 104 | Bob |
| ... | ... | ... |
| ... | ... | ... |
table2:
| yyyy_mm_dd | company_id | tier |
|-------------------|------------|--------|
| 2020-11-10 | 321 | Bronze |
| 2020-11-09 | 632 | Silver |
| 2020-11-08 | 598 | Gold |
| 2020-11-07 | 104 | Bob |
| ... | ... | ... |
| ... | ... | ... |
| 2019_12_13_backup | 321 | Bronze |
| 2019_12_13_backup | 632 | Silver |
| ... | | |
查询:
select
p.yyyy_mm_dd,
p.company_id,
p.account_manager,
t.tier
from
table1 p
left join(
select
yyyy_mm_dd,
company_id,
max(tier) as tier
from
table2
where
yyyy_mm_dd >= "2019-02-02"
group by
1,2
) t on (t.company_id = p.company_id and t.yyyy_mm_dd = p.yyyy_mm_dd)
where
p.yyyy_mm_dd >= "2019-02-02"
and p.yyyy_mm_dd <= (select max(yyyy_mm_dd) from table2 where yyyy_mm_dd < (select max(yyyy_mm_dd) from table2 where yyyy_mm_dd is not null))
由于 table2
在 yyyy_mm_dd
列中包含 backup_2019_12_31
,因此在 table 上执行 max()
时将返回这些行。所以我需要获得第二高的值,从此处的数据集中将是 2020-11-10
。每个 yyyy_mm_dd
.
company_ids
本质上,我想查询 table1
,其中 yyyy_mm_dd
介于 table1
起点(硬编码为 2019-02-02
)和 [=19 的真实最大日期之间=]
要从 table3 中获取第二高的日期,您可以使用 dense_rank。具有第二高日期的所有行都将被分配 rn=2。使用 LIMIT 获取单行或使用 max() 或相同的不同聚合,然后将 table 与 max_date 和过滤器交叉连接。
with max_date as(
select yyyy_mm_dd
from
(
select yyyy_mm_dd,
dense_rank() over(order by yyyy_mm_dd desc) rn
from table2
)s
where rn=2 --second max date
limit 1 --need only one record
)
select t1.*
from table1 t1
cross join max_date t2
where t1.yyyy_mm_dd <= t2.yyyy_mm_dd