2017-10-16 69 views
0

我有一個表中有一些我想刪除的不正確的數據。刪除重複的數據,其中有不同的日期條目保留最早的一個

邏輯如下。代碼,名稱和來源相同(如下表中的前三行,我想用最早的日期保留記錄,所以在這種情況下2017-01-02,然後刪除其他兩行。 ?此

DateEntry Code Name  Source 
    2017-01-02 ABCF Blah  SS 
    2017-03-02 ABCF Blah  SS 
    2017-04-02 ABCF Blah  SS  
    2017-03-08 BVFT Andy  SS 
    2017-04-14 BVFT Andy  SS 
    2017-04-20 BVFT Blob  SS 
    2017-04-28 BVFT Blob  SS 
    2017-05-14 BVFT Blob  SS 
    2017-06-02 BVFT Blob  SS 

我想要什麼,

DateEntry Code Name  Source 
    2017-01-02 ABCF Blah  SS 
    2017-03-08 BVFT Andy  SS 
    2017-04-20 BVFT Blob  SS 

回答

1

通過DateEntry列的升序給由列CodeNameSource和順序劃分的行數。然後刪除了具有行號的行大於1

查詢

;with cte as(
    select [rn] = row_number() over(
     partition by Code, Name, Source 
     order by DateEntry  
    ), * 
    from your_table_name 
) 
delete from cte 
where rn > 1; 

Find a demo here

0

您可以使用排序功能ROW_NUMBERPARTITION BY Code, Name

WITH Ranked 
AS 
(
    SELECT 
     DateEntry, Code,Name, Source, 
     ROW_NUMBER() OVER(PARTITION BY Code, Name ORDER BY DateEntry) AS RN 
    FROM table1 
) 
SELECT DateEntry, Code,Name, Source 
FROM Ranked 
WHERE RN = 1; 

分級功能將產生每行的行號,組中的第一個是1,最早的那一行。然後過濾器將刪除除了每組的第一行之外的所有內容。

結果:

| DateEntry | Code | Name | Source | 
|------------|------|------|--------| 
| 2017-01-02 | ABCF | Blah |  SS | 
| 2017-03-08 | BVFT | Andy |  SS | 
| 2017-04-20 | BVFT | Blob |  SS | 

請記住,這實際上不會刪除其他行,這只是一個選擇。

0
SELECT * FROM (
SELECT 
    *, 
    ROW_NUMBER() OVER(PARTITION BY DateEntry ORDER BY DateEntry DESC) AS rn 
FROM MyTable 
) a 
WHERE rn = 1 
0

與此

;with cte as (
SELECT *,ROW_NUMBER() OVER(PARTITION BY Code,Name,Source ORDER BY DateEntry DESC) AS rnum 
FROM MyTable 
) 
delete from cte where rnum>1 
1

你應該ROW_NUMBER()功能通過SubQuery形式嘗試:

SELECT DateEntry, 
     Code, 
     Name, 
     Source 
FROM 
(
    SELECT *, 
      ROW_NUMBER() OVER(PARTITION BY Code, 
              Name, 
              Source ORDER BY dateentry) rn 
    FROM <table_name> 
) a 
WHERE rn = 1; 

結果:

| DateEntry | Code | Name | Source | 
|------------|------|------|--------| 
| 2017-01-02 | ABCF | Blah |  SS | 
| 2017-03-08 | BVFT | Andy |  SS | 
| 2017-04-20 | BVFT | Blob |  SS | 
0
WITH t1 AS 
(
SELECT ROW_NUMBER() OVER (PARTITION BY Code,Name,Source ORDER BY DateEntry) AS 
'Rank',Code,Name,Source 
FROM TABLE 
) 
DELETE FROM t1 WHERE t1.Rank>1 
相關問題