2013-05-28 57 views
0

SQL noob here - 我試圖在一個月內比較,有多少人改變了他們的姓氏。我的技術限制我,所以我能想到的最簡單的方法是運行2個查詢:SQL最簡單的方法來過濾出相同的行?

Query 1: 
SELECT firstname, lastname 
FROM names_dataset 
WHERE date='2013-05-27' 

Query 2: 
SELECT firstname, lastname 
FROM names_dataset 
WHERE date='2013-04-27' 

Result query 1: 
John  Smith 
Michael  Johnson 
James  Williams 

Result query 2: 
John  Smith 
Michael  Johnson 
James  Brown 

唯一的結果我要的是「詹姆斯·布朗」,它具有改變COL2在不同的日期。

我從兩個查詢(ppl誰沒有更改名稱)得到很多重複的結果,我怎麼只過濾掉col2更改的行?

+3

你怎麼知道這是否是一個合法的名稱更改? IE瀏覽器。詹姆斯布朗,詹姆斯瓊斯,詹姆斯約翰遜,這些名稱的變化,或只是不同的人?除了名字和姓氏之外,你需要一些獨特的東西來逐日比較它們。 –

+0

名字實際上是:1582142475813,2402291960465和姓氏是:10000015249,10527957.爲了清晰起見,我在這個問題中將其簡化爲名稱 – user1899415

+0

您能否將從names_dataset的列名的完整列表添加到您的問題中? –

回答

1
SELECT t1.firstname, 
      t1.lastname AS from_lastname, 
      t2.lastname AS to_lastname 
     FROM names_dataset AS t1 
INNER JOIN names_dataset as t2 
     ON t1.firstname = t2.firstname 
    WHERE t1.date='2013-04-27' 
     AND t2.date='2013-05-27' 
     AND t1.lastname <> t2.lastname 

這將提供一個列表,這兩行在兩個日期都有相同的名字,但姓氏不同。

+0

是的。添加和更改將被視爲平等。 – mzedeler

+0

我想OP是什麼想要的是列表2中不同值的用戶列表,從2個不同的日期,即只有變化不是新行 –

+0

你是對的。在這種情況下,它有點複雜。我會再嘗試。謝謝。 – mzedeler

0

也許你會發現這種方法很有用。我用它來「增加了」或「刪除」的分配出現在一個集中的每一行而不是其他:

select firstname, lastname, 
     (case when MAX(which) = 'later' then 'ADDED' 
      when MAX(which = 'earlier' then 'REMOVED' 
      else '???' 
     end) 
from ((SELECT firstname, lastname, 'later' as which 
     FROM names_dataset 
     WHERE date='2013-05-27' 
    ) union all 
     (select firstname, lastname, 'earlier' 
     FROM names_dataset 
     WHERE date='2013-04-27' 
    ) 
    ) t 
group by firstname, lastname 
having count(*) = 1; 

它由兩組組合的名​​字,並計算出現一次的數量。如果事件發生在較晚的時間段內,則添加記錄。如果僅在較早的時間段,那麼它被移除。

此外,這是標準的SQL,所以它應該適用於大多數數據庫。

1

鑑於你的名字域是唯一的工作原理:

SELECT * 
FROM (SELECT firstname, lastname 
     FROM names_dataset 
     WHERE date='2013-05-27' 
    )day1 
JOIN 
    (SELECT firstname, lastname 
     FROM names_dataset 
     WHERE date='2013-04-27') 
    )day2 
ON day1.firstname = day2.firstname 
WHERE day1.lastname <> day2.lastname 

這一切返回,如果你只是想「詹姆斯·布朗」,那麼你會選擇部分更改爲:

SELECT day2.firstname, day2.lastname 
+0

這個作品,非常感謝!第一次運行子查詢:) – user1899415

0

SQL Fiddle demo

我爲此使用了SQL Server;我會用自己的內部聯接來解決這個問題(注意ID字段僅用於測試目的)。通過名字加入表格並找到名字和姓氏字段不匹配的地方。如果您懷疑名字可能已更改,請將此查詢翻譯爲名字。

最終查詢:

SELECT * 
FROM names n1 
    INNER JOIN names n2 ON n1.FirstName = n2.FirstName 
WHERE n1.LastName <> n2.LastName 

或者,my preferred method (SQL Fiddle also)是使用一個ID字段,並與ID字段加入。這可以在首字母或姓氏上發現任何變化,並且整體上更加簡單,再加上它解決了第一個意見,它正確地指出了一個問題 - 你怎麼知道詹姆斯不是一個新人?此查詢:

SELECT * 
FROM names n1 
    INNER JOIN names n2 ON n1.ID = n2.ID 
WHERE n1.FirstName <> n2.FirstName 
    OR n1.LastName <> n2.LastName