2009-09-11 74 views
1

老闆已經給了我,我不知道是可能的,因爲兩週後的分配,我不能找出解決的辦法,所以我投了這一點,要求任何形式的來自SO團隊的幫助。如果這打斷了你的大腦,我很抱歉。如何重新定義鮮明

首先給出一些背景:我們開發了一個數據庫查詢應用程序,允許用戶找回他們從數據庫中呼風喚雨,而無需瞭解任何SQL。

我的問題:我們想定製使用「獨特」選擇的方式。我們不希望將distinct關鍵字應用於選定的行,而是僅將它應用於某些字段,以便匹配字段的第一行將被使用。舉一個例子:

鮑勃·瓊斯大街122號,波特蘭,俄勒岡
蘇瓊斯大街122號,波特蘭,俄勒岡
瑪麗·史密斯,458 32街,波特蘭,俄勒岡
拉爾夫·史密斯,458 32街,波特蘭,俄勒岡
我們希望這能奏效,只有每個地址的第一行返回如下

鮑勃·瓊斯大街122號,波特蘭,俄勒岡
瑪麗·史密斯,458 32街,波特蘭,OR

隨着正常的不同,所有四個行會被退回,這比我們想要的。有沒有人對我們如何去做這件事有任何想法?謝謝。

回答

5
WITH NumberedRows AS (
    SELECT FirstName, LastName, Address, 
      ROW_NUMBER() OVER (PARTITION BY Address ORDER BY Id) as RowNumber 
    FROM Table 
) SELECT FirstName, LastName, Address 
    FROM NumberedRows 
    WHERE RowNumber = 1; 

PARTITION BY Address指定您希望組的列清單,並ORDER BY ID表明您定義與「第一」項目列的列表。

(確保前面的語句用分號終止。)

+0

這很好用,我們的DBA向我索要一份她正在進行的其他項目的SQL副本。另外,隨着我​​們的程序結構化,實施這應該是一個蛋糕散步。 – 2009-09-11 21:26:17

3

你必須運行一個普通的「SELECT DISTINCT」只爲字段查詢其實也需要是不同的SQL語句。然後,一旦將這些數據返回,請運行另一個查詢,查找具有匹配數據的TOP 1記錄以獲取非明確字段。目前,我沒有看到一個方式單一SQL語句來做到這一點...

3

SELECT MIN(a.firstname + a.lastname),地址從X組通過地址。

這是一個過於簡單的答案,但它可以讓你的觀點一致。它將只爲每個不同的地址返回「較小」的名稱。

你需要使用現場拼接做優爲好,但它會給你你所需要的。

+0

這將工作,是的,我希望我會記得它之前,我一個幾周前打破了我的大腦。唯一的缺點是我需要對幾段代碼進行適度的重寫,而接受的答案要求對系統重寫的次數要少得多。 – 2009-09-11 21:30:57