[英]PostgreSQL get results grouped by Name but ordered by modified_date desc for the first element of each group
[英]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.