2012-07-12 52 views
3

所以問題是這樣的。我有一個包含n列數據的表格,但我想列出每列3列的唯一一行。SQL獲得第一個全行匹配子查詢中的每個結果

例如,假設該表的結構如下

ID | data1 | data2 | data3 | description | price | handler | creationTime | etc... 

我想要做的,就是用這個子查詢:

SELECT distinct data1, data2, data3 FROM Table_1 

......讓每一個獨特的變化爲3列。但是,我想從表格中爲每個這樣的結果選擇一個完整的行。

此查詢意味着相當大的用途,需要優化,這是爲什麼我不能使用表變量或while循環。任何提示?

+0

可能的重複:http://stackoverflow.com/questions/11424506/selecting-the-first-row-from-each-group-with-order-by-more-than-one-column/11424557#11424557 – 2012-07-12 12:52:23

回答

1

如果您正在使用SQL Server,你可以做到這一點了公用表表達式:

with minRow(ID) as 
    (select min(ID) 
    from Table_1 
    group by data1, data2, data3) 
select t1.* 
from Table_1 t1 join minRow m1 on t1.ID = m1.ID 
+0

這看起來有效,謝謝!我明天會測試一下! – Kahn 2012-07-12 13:52:42

1

我不認爲你理解DISTINCT的概念。如果您有:

ID data1 data2 data3 description1 price1 
ID data1 data2 data3 description2 price2 

您對結果有什麼期望? ID data1 data2 data3將只返回一次,但是應該發生與那些相同的其他列不同的列?

你總是可以做

select distinct ID, data1, data2, data3, MAX(description1), MAX(price1) 

它將解析,並給你一個結果,但它實際上不會太大意義......

+0

對不起,我不明白。我不明白DISTINCT的概念,究竟是什麼?我承認這個問題很奇怪。實際上,返回的第一行會有過濾器,但我試圖在這裏簡單地保持示例。一旦有一種方法可以有效地過濾每組3個數據的第一個結果,爲其添加更多的過濾器是一件簡單的事情。 :) – Kahn 2012-07-12 13:46:30

+0

我的意思是,如果您在行之間的列A B和C上獲得不同的值,您可以以某種方式將所有在A B和C上具有相同值的行分組。對於沒有被分組的列,你贊成什麼?您需要對其應用某種聚合。 – Diego 2012-07-12 15:30:39

+0

哦,對,是的,你是對的。就像我在之前的評論中所說的那樣,將會有更多的過濾器被定義來確定哪一列和哪一個值決定了每一組3的第一個選擇。但是我不知道它們到底是什麼。 :) – Kahn 2012-07-13 11:42:31

1

你需要的是windows函數。下面是從每個組返回「第一」行的查詢:

select t.* 
from (select t.*, 
      row_number() over (partition by data1, data2, data3 
           order by (select NULL)) as seqnum 
     FROM Table_1 t 
    ) t 
where seqnum = 1 

(這也包括在它爲「1」的最終SEQNUM列)

的想法是提供一種序列每行的數量並取第一個。 「order by」條款是必需的。此查詢中的語法只是在SQL Server中說「我不關心訂單」的一種有效方式 - 這在其他數據庫中有所不同。

相關問題