在apachespark或databricks中使用sql获取字段最后一个值的正确方法(last和last\u值的正确行为)?

ymdaylpp  于 2021-07-14  发布在  Spark
关注(0)|答案(2)|浏览(468)

apachespark/databricks sql中last和last\u value函数的正确行为是什么。我阅读文档的方式(这里:https://docs.databricks.com/spark/2.x/spark-sql/language-manual/functions.html)听起来它应该返回表达式中的最后一个值。
如果我有一个select语句

select 
  person,
  last(team)
from
  (select * from person_team order by date_joined)
group by person

我应该让一个人加入最后一个团队,是/否?
我正在运行的实际查询如下所示。每次执行查询时,它都返回不同的数字。

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

获取给定字段的最后一个值的正确方法是什么(对于团队示例或我的特定示例)?
---编辑

sshcrbum

sshcrbum1#


我认为collect\u set在这里可能很有用,但是当我尝试运行此程序时,出现了错误:

select
  patient_id,
  last_value(collect_set(data_lot)) data_lot
from
  covid.demo
group by patient_id
;


sql语句中出错:analysisexception:不允许在另一个聚合函数的参数中使用聚合函数。请在子查询中使用内部聚合函数。;;将[患者id#89338],[患者id#89338,最后一个Š值(收集Š集合(数据Š批次Š89342,0,0),false)聚合为数据Š批次Š91848]+-子查询别名sparkŠcatalog.covid.demo
下面显示的帖子讨论了如何获得最大值(与按不同字段排序的列表中的最后一个不同,我想要一个球员加入的最后一个球队,该球员可能加入了红军、a队、斑马队和扬基队,按时间顺序,我在找扬基队),这些帖子使用python/r按程序获得解决方案。我想用sql来做这个。
获取spark中组的最后一个值
查找sparkDataframe中每组的最大行数

mm5n2pyu

mm5n2pyu2#

您可以根据上的排序指定行号 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');

相关问题