2012-10-11 3 views
3

삭제, 일부 반환 된 행을 무시 각각 recipient_id에 대한SQL :이 테이블이 다른

  • , 우리는 계속 마지막으로 5 항목을 읽었고 이전에 읽은 항목을 삭제합니다.

RECURSIVE WITH 문으로 내 마음을 구부 렸지만 비참하게 실패했습니다. 프로그래밍 방식으로 솔루션을 구현했지만 괜찮은 순수 SQL 솔루션이 있는지 알고 싶습니다.

답변

2
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()을 사용하십시오!

0
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 
) 
0

체크 아웃 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 
)