2014-02-06 65 views
-3

我在嘗試編寫一個查詢,該查詢將在值更改之前刪除「重複」值。例如,我有以下數據:刪除SQL查詢中的「重複」記錄

id, date_recived, name1, percent 
1, 8/19/13, Joe, 2 
2, 8/15/13, Joe, 3 
3, 8/12/13, Joe, 2 
4, 4/08/13, Joe, 2 

在此示例中,我需要僅刪除id爲3的行,因爲百分比沒有變化。我已經使用ROW_NUMBER試過了,但是當我通過名稱和百分比劃分出現的數據如下:

id, date_recived, name1, percent, Row_Number 
1, 8/19/13, Joe, 2, 3 
2, 8/15/13, Joe, 3, 1 
3, 8/12/13, Joe, 2, 2 
4, 4/08/13, Joe, 2, 1 

這不會起作用,因爲1人丟在外面,我需要保持它。任何幫助,將不勝感激。

感謝,

編輯:

查詢是(從評論):

WITH feedback_On_Same_Date AS (
     SELECT id, received_dt, participant_nm, pretax_deferral_prcnt, 
      ROW_NUMBER() OVER(PARTITION BY participant_nm, received_dt ORDER BY received_dt DESC, id DESC) AS RowNumberByDt 
     FROM be_ing_feedback 
    ) 
SELECT *, ROW_NUMBER() OVER(PARTITION BY participant_nm, pretax_deferral_prcnt ORDER BY received_dt ASC, id ASC) AS RowNumberByDef 
FROM feedback_On_Same_Date 
WHERE RowNumberByDt = 1 
ORDER BY participant_nm ASC, received_dt DESC 
+0

請發表您已經試過SQL。 – Kermit

+0

你正在使用哪些DBMS?甲骨文? Postgres的? –

+0

假設SQL Server? – gvee

回答

1

這聽起來像你想刪除的行裏的 「以前」,一個是相同的。

要做到這一點,我將使用ROW_NUMBER()函數和自連接:

; WITH cte AS (
    SELECT id 
     , date_recived 
     , name1 
     , percent 
     , Row_Number() OVER (PARTITION BY name ORDER BY date_recived) As seq 
    FROM your_table 
) 
SELECT * 
FROM cte As curr 
LEFT 
    JOIN cte As prev 
    ON prev.name1 = curr.name1 
    AND prev.seq + 1 = curr.seq 

看一看這個查詢返回的數據,然後它應該只是增加一個WHERE的簡單情況子句來獲取要刪除的記錄。

我會留下難題的其餘部分給你;-)

+0

這爲我工作。謝謝! – Spoonman

0

如果您使用的是SQL Server 2012中,只需使用lag()功能:

select id, date_recived, name1, percent 
from (select t.*, 
      lag(percent) over (partition by name1 order by date_received) as prev_percent 
     from t 
    ) t 
where percent <> prev_percent or prev_percent is null; 
+0

這將是可怕的,並會出現工作。太糟糕了,我只用了2008年。謝謝你,雖然。 – Spoonman