使用 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');