分区依据,密集等级

Posted

技术标签:

【中文标题】分区依据,密集等级【英文标题】:Partition by, dense rank 【发布时间】:2022-01-24 01:04:50 【问题描述】:

我有下表描述了患者就诊:每个患者都有一个 visit_id,他会为此去看给定的医生。我正在尝试提取他的第三位医生看到的 visit_id 的值。 (第 3 位医生,而不是第 3 次就诊)

patient visit_id physician
a 1 id_1
a 2 id_2
a 3 id_1
a 4 id_3
b 5 id_1
b 6 id_2
c 7 id_1
c 8 id_2
c 9 id_3

所以结果是:

patient visit_id
a 4
c 9

有什么建议吗?

【问题讨论】:

密集排名有什么问题? DB Fiddle 对于那些感兴趣的人 【参考方案1】:

您可以按patientphysician 分组以删除“重复”医生并使用min 代替visit_id

-- test data
WITH dataset (patient, visit_id, physician) AS (
    VALUES ('a', 1, 'id_1'),
        ('a', 2, 'id_2'),
        ('a', 3, 'id_1'),
        ('a', 4, 'id_3'),
        ('b', 5, 'id_1'),
        ('b', 6, 'id_2'),
        ('c', 7, 'id_1'),
        ('c', 8, 'id_2'),
        ('c', 9, 'id_3')
)

-- query
select patient, visit_id
from (
        select *,
            row_number() over (partition by patient order by visit_id) rnk
        from (
                select patient,
                    min(visit_id) visit_id,
                    physician
                from dataset
                group by patient, physician
            )
    )
where rnk = 3

输出:

patient visit_id
a 4
c 9

请注意,此查询使用 presto 语法(因为您的问题具有 presto 标签)。

【讨论】:

【参考方案2】:

以下语句返回您的结果。最里面的子查询消除了对同一个医生的多次访问,然后row_number() 计算访问次数,最外面的select 获得第三位医生。

select patient, visit 
  from (select patient, visit, row_number() over (partition by patient order by visit) rn
          from  (  select patient, min(visit) as visit 
                     from tab 
                 group by patient, physician
                ) t1
       ) t2
 where t2.rn = 3

结果:

patient visit_id
a 4
c 9

见db<>fiddle

【讨论】:

以上是关于分区依据,密集等级的主要内容,如果未能解决你的问题,请参考以下文章

spark中密集等级和行数的差异

设计数据密集型应用 第六章:分区

分区依据的 Amazon Redshift Spectrum 不返回结果

如何使用两个日期范围进行计算(分区依据和之前)

R:相当于“等级”和“分区”[关闭]

窄依赖与宽依赖&stage的划分依据