2015-01-27 2 views
1

RANKCTE 검색어에 새로운입니다.테이블 위치 'RANK'> 1에서 삭제

SELECT 
    * 
    ,ROW_NUMBER() OVER(PARTITION BY name, Product ORDER BY Date desc) AS 'RANK' 
FROM 
    Config 
WHERE 
    Name 
    IN 
    (SELECT 
     name 
    FROM 
     Config 
    GROUP BY 
     Name 
     ,Product 
     ,Amount 
     ,Date 
    HAVING 
     COUNT(name) >1) 
     AND 
     Product 
     IN 
     (SELECT 
      Product 
     FROM 
      Config 
     GROUP BY 
      Name 
      ,Product 
      ,Amount 
      ,Date 
     HAVING 
      COUNT(name) >1) 

다음은 샘플 결과가 조건을 만족 :

ID|name|Product|Amount|Date  |RANK| 
--------------------------------------- 
1 |a |0000 |1  |2015-01-01| 1 | 
2 |a |0000 |1  |2015-01-01| 2 | 
3 |a |1111 |0  |2015-01-01| 1 | 
4 |a |1111 |0  |2015-01-01| 2 | 
5 |b |2222 |1  |2015-01-01| 1 | 
6 |b |2222 |1  |2015-01-01| 2 | 
7 |b |3333 |0  |2015-01-01| 1 | 
8 |b |3333 |0  |2015-01-01| 2 | 

DELETERANK > 1을 만족하는 기록에 가장 좋은 방법은 무엇입니까 다음은 내 쿼리입니다?

답변

2

을 그것의 모습에서, 당신은 NameProduct이 최신 하나를 떠나 중복 된 항목을 삭제합니다. 당신이 당신의 쿼리를 단순화 할 수 있습니다 :

SELECT 
    *, 
    RN = ROW_NUMBER() OVER(PARTITION BY Name, Product ORDER BY [Date] DESC) 
FROM Config 

당신은 다음 CTE에 넣어와 DELETE을 실행할 수 있습니다.

CREATE TABLE Config(
    ID  INT, 
    Name VARCHAR(10), 
    Product VARCHAR(10), 
    Amount INT, 
    [Date] DATE 
) 
INSERT INTO Config VALUES 
(1, 'a', '0000', 1, '2015-01-01'), 
(2, 'a', '0000', 1, '2015-01-01'), 
(3, 'a', '1111', 0, '2015-01-01'), 
(4, 'a', '1111', 0, '2015-01-01'), 
(5, 'b', '2222', 1, '2015-01-01'), 
(6, 'b', '2222', 1, '2015-01-01'), 
(7, 'b', '3333', 0, '2015-01-01'), 
(8, 'b', '3333', 0, '2015-01-01'); 

;WITH CTE AS(
    SELECT 
     *, 
     RN = ROW_NUMBER() OVER(PARTITION BY Name, Product ORDER BY [Date] DESC) 
    FROM Config 
) 
DELETE FROM CTE WHERE RN > 1 

SELECT * FROM Config 
+0

하하 !! 당신은 방금 조금 전에 또 다른 질문에 나를 도왔습니다. 마지막 답변에서 논리를 적용 할 수있는 곳을 찾았습니다. 분당 upvote –

+0

''CTE'를'DROP'해야합니까, 아니면 범위를 벗어날 때 자동으로 삭제합니까? –

+1

'CTE'를'DROP '할 필요가 없습니다. 자세한 내용은 https://technet.microsoft.com/en-us/library/ms190766%28v=sql.105%29.aspx#feedback을 참조하십시오. 배울 수있는 좋은 기능입니다! –

1

당신은 CTE를 사용할 수 있습니다

with todelete as (<your query here>) 
delete from todelete 
    where [rank] = 1; 
+0

내가'은'CTE'을 DROP' 필요하거나 하락하지 마십시오 범위를 벗어날 때 자동으로? –

+1

CTE는 CTE가 사용되는 명령문에 대해서만 정의됩니다. 하위 쿼리와 매우 비슷합니다. –

1

당신은 당신이 최대한 활용하려는 당신이 원하는대로 (이 :)에 대한 사용자 Row_nimber() 및 CTE로하지 않을 경우) 결과가 설정

를 반환하는 간단한 방법을 사용할 수 있습니다 이름과 제품명별로 최근 날짜.

select c1.Name,c1.Product,c1.Amount,max(c1.Date) as Date from Config c1 
group by c1.Name,c1.Product,c1.Amount 

또 다른 방법은, 가장 최근의 날짜도

감사합니다 것을 사용하여 정렬 할 수 있습니다, CROSS APPLY를 사용하는 것입니다