繁体   English   中英

如何删除在postgresql日期列上排序的每个分组结果中的第一行

[英]How to remove first row in every grouped result ordered on date column in postgresql

我有一个由n列组成的 sql 数据(表),但特别感兴趣的是 3

声明_id 患者编号 入学日期
1 p_1 2001-01-01
2 p_2 2001-02-01
3 p_1 2001-01-01
4 p_3 2001-02-02
5 p_2 2001-03-01
6 p_2 2001-04-01
7 p_1 2001-04-01

我想要的是删除每个patient_id第一行(基于admission_date )。 如果任何患者在他/她的第一次入院日期有两行(例如, patient_id = p_1有 2 行1 & 3具有相同的入院日期),则删除所有这些行; 并得到这样的输出

声明_id 患者编号 入学日期
5 p_2 2001-03-01
6 p_2 2001-04-01
7 p_1 2001-04-01

我不太熟悉 sql,但我可以在R使用duplicated . 在 POSTGRESQL 中是否有这样的内存高效(我必须至少过滤 1000 万行)?

我尝试过什么? sql 中基本没有。 如果该数据较小,我可以将其导出到 R 中并在那里进行分析。

请帮忙。

您可以为此使用窗口函数:

select claim_id, patient_id, admission_date
from (
  select claim_id, patient_id, admission_date, 
         dense_rank() over (partition by patient_id order by admission_date) as rn
   from the_table
) t 
where rn > 1;

dense_rank()为每个按入院日期排序的患者 ID 创建序列号。 如果两行具有相同的admission_date,它们将获得相同的“排名”。 外部查询中的 WHERE 子句只是删除每个患者的“第一”行。

我们可以在这里使用存在逻辑:

SELECT claim_id, patient_id, admission_date
FROM yourTable t1
WHERE EXISTS (SELECT 1 FROM yourTable t2
              WHERE t2.patient_id = t1.patient_id AND
                    t2.claim_id < t1.claim_id);

鉴于某些患者似乎在同一天多次入院,我使用claim_id作为有序标识符来确定哪个入院先到。

如果上述性能是一个问题,那么以下索引应该会大大加快速度:

CREATE INDEX idx ON yourTable (patient_id, claim_id);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM