삭제, 일부 반환 된 행을 무시 각각 recipient_id
에 대한SQL :이 테이블이 다른
- , 우리는 계속 마지막으로 5 항목을 읽었고 이전에 읽은 항목을 삭제합니다.
RECURSIVE WITH
문으로 내 마음을 구부 렸지만 비참하게 실패했습니다. 프로그래밍 방식으로 솔루션을 구현했지만 괜찮은 순수 SQL 솔루션이 있는지 알고 싶습니다.
삭제, 일부 반환 된 행을 무시 각각 recipient_id
에 대한SQL :이 테이블이 다른
RECURSIVE WITH
문으로 내 마음을 구부 렸지만 비참하게 실패했습니다. 프로그래밍 방식으로 솔루션을 구현했지만 괜찮은 순수 SQL 솔루션이 있는지 알고 싶습니다.
DELETE FROM tbl t
USING (
SELECT id, row_number() OVER (PARTITION BY recipient_id
ORDER BY updated_at DESC) as rn
FROM tbl
WHERE is_read
) x
WHERE x.rn > 5
AND x.id = t.id;
JOIN
특히 항목의 큰 숫자와 함께, 일반적으로 빠른 발현에보다.
그리고 row_number()
, not rank()
을 사용하십시오!
delete from t
where id in (
select id
from (
select
id,
row_number() over(partition by recipient_id order by updated_at desc) rn
from t
where is_read
) s
where s.rn > 5
)
체크 아웃 window functions :
DELETE FROM table
WHERE id IN (
SELECT id
FROM (
SELECT id, rank() OVER (PARTITION BY recipient_id ORDER BY updated_at DESC) as position
FROM table
WHERE is_read
) subselect WHERE position > 5
)