【发布时间】:2021-12-05 19:28:12
【问题描述】:
我是一名 Spark SQL 查询开发人员。我有一个复杂的要求,即根据连续/连续的日期对记录进行分组。
首先,我们需要根据strt_dt 和dschrg_dt 对同一患者(X5624)按ASC 顺序排列记录。下单后——
第一步:
我们需要检查这些记录是否连续/连续 - 即它们是否有连续的日期。也就是说,上一条记录的dschrg_dt是否等于当前记录的strt_dt。如果是,则所有此类记录都应归入同一组。
第 2 步:
如果上一条记录的dschrg_dt 和当前记录的strt_dt 之间有任何间隔 1 天或更多天,则该组结束,然后是新组应该开始,之后出现的所有连续记录都将属于该新组,直到出现另一个间隙。
步骤 3:
对于每个这样的组(在上面的步骤 1 中标识),找到在 strt_dt 和 dschrg_dt 之间具有最大跨度(以天为单位)的主记录(在该组内),然后将其 group-id 复制到所有剩余的该组中的记录。
输入:
GroupId | pat_id | clm_num | clm_line | strt_dt | dschrg_dt
123-1 | X5624 | 123 | 1 | 05-Jan-2019 | 07-Jan-2019
629-3 | X5624 | 629 | 3 | 07-Jan-2019 | 14-Jan-2019
918-2 | X5624 | 918 | 2 | 14-Jan-2019 | 15-Jan-2019
307-1 | X5624 | 307 | 1 | 08-May-2019 | 11-May-2019
478-3 | X5624 | 478 | 3 | 11-May-2019 | 12-Jan 2019
预期输出:
Group Id | pat_id | clm_num | clm_line | strt_dt | dschrg_dt | main_rec_ind
629-3 | X5624 | 123 | 1 | 05-Jan-2019 | 07-Jan-2019 | N
629-3 | X5624 | 629 | 3 | 07-Jan-2019 | 14-Jan-2019 | Y
629-3 | X5624 | 918 | 2 | 14-Jan-2019 | 15-Jan-2019 | N
307-1 | X5624 | 307 | 1 | 08-May-2019 | 11-May-2019 | Y
307-1 | X5624 | 478 | 3 | 11-May-2019 | 12-Jan 2019 | N
请注意以下几点:
- 所有记录都属于患者 X5624,整个记录集是
排序在
strt_dt&dschrg_dt - 输入中的前 3 条记录是连续的,即前一条记录的
dschrg_dt等于当前记录的strt_dt。因此,这 3 记录属于同一组。 - 该组中的主要记录是
2nd记录,因为它的跨度为strt_dt和dschrg_dt之间的天数是14天数,大于同一组中的所有其他记录。因此,它的组 ID '629-3' 被复制到另一个 它的组中的记录。同样,第二组的主记录是第 4 记录 - 现在第 4 条记录与之前的记录(第 3 条记录)之间存在差距,因此与第 3 条记录不连续,因此将落入新的组中
- 但是,第 5 条记录连续到第 4 条记录,因此也将落入第 2 组,并从第 4 条记录中获取其
GroupId(307-1)
谁能帮我在 Spark SQL 查询中实现这个?到目前为止,我只能识别连续记录,但无法将主记录的GroupId复制到该组中的其他记录。
select
groupid, pat_id, clm_num, clm_line, strt_dt, dschrg_dt,
case
when lag(dschrg_dt is null
then 'true'
when lag(dschrg_dt) over (partition by pat_id order by strt_dt asc, dschrg_dt desc) = strt_dt
then 'true'
else 'false'
end as tmp_grp
from pat_clms;
我无法从这里继续。任何人都可以帮我在 Spark SQL 查询中实现这一点吗?感谢任何输入。如果需要,很乐意提供更多信息。非常感谢。
【问题讨论】:
-
请添加您创建数据报表。
标签: sql apache-spark apache-spark-sql