分区依据,密集等级
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】:您可以按patient
和physician
分组以删除“重复”医生并使用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
【讨论】:
以上是关于分区依据,密集等级的主要内容,如果未能解决你的问题,请参考以下文章