2014-03-27 39 views
1

我在SQL Server 2008 R2中工作。我有一張表,其中1個「記錄」實際上是幾個記錄,因爲它的一個字段具有不同的值。該表本身有很多字段。對於給定「記錄」的所有字段將具有相同的值,除了具有各種值的一個字段。我想查詢所有記錄並返回所有字段,但我只需要每個「記錄」的1個實例(第一個)。例如,我的表是這樣的:如何在查詢多列時在1個鍵列上選擇DISTINCT

Field 1 Field 2  Field 3 
value a value x  value 1 
value a value x  value 2 
value a value x  value 3 
value b value y  value 20 
value b value y  value 21 
value b value y  value 22 

我想我的查詢返回的東西,如:

Field 1 Field 2  Field 3 
value a value x  value 1 
value b value y  value 20 

所以,我的字段1是我的鑰匙。通常情況下,我只是做一個SELECT DISTINCT。但是,由於我希望查詢中返回所有字段,所以DISTINCT將應用於SELECT中的所有字段,這意味着所有記錄都將返回,而不是每個鍵的值都爲1。完成這個的最好方法是什麼?

+0

請將它們稱爲**列**,而不是*字段*。 –

回答

2
SELECT t.field1,t.field2,t.field3 FROM 
(
SELECT *, ROW_NUMBER() OVER (PARTITION by Field1 ORDER BY Field1) AS RowNumber 
FROM mytable 
) t 
WHERE t.RowNumber = 1 
的分

此方法僅查看第一列的不同方面。在SQL中不保證順序。您可以通過上面的代碼的「ORDER BY」部分來設置如何定義「First Row」。

+1

正確答案。如果表中有一個標識列,那麼使用它作爲OrderBy來獲取結果集中的「第一個」行。 –

+0

我喜歡這個解決方案的附加控制。不幸的是,當我開始更多地調查我的列時,結果發現其他字段的行爲與字段3相似(我在表格中大約有100個字段)。因此,我必須識別所有字段並排除他們從分區。 – user3100444

+0

本質上,我試圖在Excel中模擬「刪除重複」功能,我只需要激活字段1的複選框。 – user3100444

0

您可以使用Group By超過field 1field 2;

1

假如你想從現場3最小值:

SELECT [Field 1], [Field 2], MIN([Field 3]) 
FROM YourTable 
GROUP BY [Field 1], [Field 2] 
1

你會通過字段1 &場2要分組,然後採取現場3

select  [Field 1], 
      [Field 2], 
      MIN([Field 3]) as [Field 3] 
from  [SomeTable] 
group by [Field 1], [Field 2]