2016-08-04 84 views
1

我有一個包含3列的表,第一列是'name'。一些名字被輸入兩次,大約三次,還有一次以上。我想只爲每個名稱保留一個值,並根據第2列和第3列的值刪除額外的行。如果第2列和第3列爲空,我想刪除該行。 沒有主鍵或ID列。 表中有大約275萬行。 想在SQL中使用一個查詢(最好)刪除14.有人可以幫忙嗎?根據另一列的值刪除重複信息

Name column2 column3 
Suzy english null 
Suzy null null 
Suzy null  5 
John null null 
John 7  7 
George null benson 
George null null 
George benson null  
George 5  benson 

想擁有它爲:

Name column2 column3 
Suzy english null 
Suzy null  5 
John  7  7 
George benson null 
George 5  benson  

提前非常感謝。

+0

不會再有一個喬治排?一行用'George,benson,null'和另一行用'George,null,benson'加上最後一個用'5,benson'。 – TTeeple

+0

您還可以考慮控制數據添加到表中的方式,因此您不必首先完成清理工作? – bhs

回答

0

在使用的名稱與分區適當的順序:

WITH cte as (
    SELECT ROW_NUMBER() 
    OVER (PARTITION BY name 
      ORDER BY case 
      when column1 = 'null' and column2 = 'null' then 3 
      when column2 = 'null' then 2 
      when column1 = 'null' then 1 
      else 0 end 
    ) num 
    FROM mytable 
) 
delete from cte where num > 1 

這將刪除重複的,按優先順序一致,行有:

  1. 都列1和列2不爲空(隨機一個保持如果有多個的這些)
  2. COLUMN1不爲空
  3. COLUMN2不爲空
  4. 都列1列2和零

注意,是查詢假設(基於評論質疑),你的「空」值實際上是文本字符串「空「而不是SQL null

如果它們實際上是空值,則用IS NULL替換= 'null'

+0

爲什麼我們需要column2 ='null',column1 ='null' – TheGameiswar

+0

@thegame打破關係,邏輯基於示例有問題的數據。查看更多細節編輯答案 – Bohemian

+0

謝謝@波希米亞。它像一個魅力工作! – Suzy

0
Delete from yourtable 
where column2 is null and column3 is null 

上面的查詢是在此基礎上..

我想基於2列3的值,並只保留一個值,每個名稱,並刪除多餘的行。如果列2和3個是空的,我想通過刪除該行

+0

謝謝,但微小的問題是,如果我做一個 seraych選擇* from mytable 其中column2爲空,column3爲空 它沒有什麼東西。但如果我做 選擇* from mytable 我可以看到2空列! 不知道如何解決問題 – Suzy

+2

這些實際的'NULL'或字符串「null」?他們是完全不同的 – TTeeple

+0

@TTEEple說'null'與Null不同.. – TheGameiswar