使用 SQL 获取 Apache Spark 或 Databricks 中字段的最后一个值的正确方法(last 和 last_value 的正确行为)?
Correct way to get the last value for a field in Apache Spark or Databricks Using SQL (Correct behavior of last and last_value)?
Apache Spark/Databricks SQL 中最后一个和 last_value 函数的正确行为是什么?我阅读文档的方式(此处:https://docs.databricks.com/spark/2.x/spark-sql/language-manual/functions.html)听起来应该 return 表达式中的最后一个值。
所以如果我有一个 select 语句做类似
select
person,
last(team)
from
(select * from person_team order by date_joined)
group by person
我应该得到最后一个加入的团队,yes/no?
我 运行ning 的实际查询如下所示。每次执行查询时,它都是 return 不同的数字。
select count(distinct patient_id) from (
select
patient_id,
org_patient_id,
last_value(data_lot) data_lot
from
(select * from my_table order by data_lot)
where 1=1
and org = 'my_org'
group by 1,2
order by 1,2
)
where data_lot in ('2021-01','2021-02')
;
获取给定字段的最后一个值的正确方法是什么(对于团队示例或我的特定示例)?
--- 编辑 ------------------
我想 collect_set 在这里可能会有用,但是当我尝试 运行 时出现错误:
select
patient_id,
last_value(collect_set(data_lot)) data_lot
from
covid.demo
group by patient_id
;
SQL 语句中的错误:AnalysisException:不允许在另一个聚合函数的参数中使用聚合函数。请在子查询中使用内部聚合函数。;;
汇总 [patient_id#89338], [patient_id#89338, last_value(collect_set(data_lot#89342, 0, 0), false) AS data_lot#91848]
+- 子查询别名 spark_catalog.covid.demo
下面显示的帖子讨论了如何获得最大值(与按不同字段排序的列表中的最后一个不同,我想要最后一个球员加入的球队,球员可能已经加入了红军,A队,斑马队和洋基队,按时间顺序排列,我正在寻找洋基队)并且这些帖子使用 python/r 在程序上获得解决方案。我想在 SQL.
中执行此操作
--- 第二次编辑 ------------------
我最终根据接受的答案使用了类似的东西。
select
row_number() over (order by provided_date, data_lot) as row_num,
demo.*
from demo
如果您想获得最后一个值,您可以根据 data_lots
上的顺序分配行号:
select count(distinct patient_id) from (
select * from (
select *,
row_number() over (partition by patient_id, org_patient_id, org order by data_lots desc) as rn
from my_table
where org = 'my_org'
)
where rn = 1
)
where data_lot in ('2021-01','2021-02');
Apache Spark/Databricks SQL 中最后一个和 last_value 函数的正确行为是什么?我阅读文档的方式(此处:https://docs.databricks.com/spark/2.x/spark-sql/language-manual/functions.html)听起来应该 return 表达式中的最后一个值。
所以如果我有一个 select 语句做类似
select
person,
last(team)
from
(select * from person_team order by date_joined)
group by person
我应该得到最后一个加入的团队,yes/no?
我 运行ning 的实际查询如下所示。每次执行查询时,它都是 return 不同的数字。
select count(distinct patient_id) from (
select
patient_id,
org_patient_id,
last_value(data_lot) data_lot
from
(select * from my_table order by data_lot)
where 1=1
and org = 'my_org'
group by 1,2
order by 1,2
)
where data_lot in ('2021-01','2021-02')
;
获取给定字段的最后一个值的正确方法是什么(对于团队示例或我的特定示例)?
--- 编辑 ------------------
我想 collect_set 在这里可能会有用,但是当我尝试 运行 时出现错误:
select
patient_id,
last_value(collect_set(data_lot)) data_lot
from
covid.demo
group by patient_id
;
SQL 语句中的错误:AnalysisException:不允许在另一个聚合函数的参数中使用聚合函数。请在子查询中使用内部聚合函数。;; 汇总 [patient_id#89338], [patient_id#89338, last_value(collect_set(data_lot#89342, 0, 0), false) AS data_lot#91848] +- 子查询别名 spark_catalog.covid.demo
下面显示的帖子讨论了如何获得最大值(与按不同字段排序的列表中的最后一个不同,我想要最后一个球员加入的球队,球员可能已经加入了红军,A队,斑马队和洋基队,按时间顺序排列,我正在寻找洋基队)并且这些帖子使用 python/r 在程序上获得解决方案。我想在 SQL.
中执行此操作--- 第二次编辑 ------------------
我最终根据接受的答案使用了类似的东西。
select
row_number() over (order by provided_date, data_lot) as row_num,
demo.*
from demo
如果您想获得最后一个值,您可以根据 data_lots
上的顺序分配行号:
select count(distinct patient_id) from (
select * from (
select *,
row_number() over (partition by patient_id, org_patient_id, org order by data_lots desc) as rn
from my_table
where org = 'my_org'
)
where rn = 1
)
where data_lot in ('2021-01','2021-02');