2012-02-02 38 views
4

例如,表三米的cols和數據SQL沒有Dup的(不同)的行,卻忽略一個山坳

col1 col2 col3 
10 20 30 
40 50 60 
40 50 80 

想要做一個選擇,其中最後兩行只返回一個因爲col1和COL2是相同的。

由於col3不同,選擇不同將不起作用。

所以輸出將

10 20 30 
40 50 xx (don't care) 
+1

哪一個應該退回?哪個RDBMS? – 2012-02-02 16:23:10

回答

6

因爲你只需要一個額外的列你可以使用任意MIN/MAX骨料和GROUP BY

SELECT col1, 
     col2, 
     MAX(col3) AS col3 
FROM YourTable 
GROUP BY col1, 
      col2 

更普遍的,如果你的RDBMS支持解析函數你可以使用

WITH T 
    AS (SELECT col1, 
       col2, 
       col3, 
       ROW_NUMBER() OVER (PARTITION BY col1, col2 
             ORDER BY col1, col2) AS RN 
     FROM YourTable) 
SELECT col1, 
     col2, 
     col3 
FROM T 
WHERE RN = 1 
+0

是的,這似乎工作正常,也,fyi可以說,,,,,(至少在SQLite中) – ort11 2012-02-02 16:40:56

+0

選擇*,MAX(col3)作爲col3從表組中col1,col2 – ort11 2012-02-02 16:46:19

+0

*,MAX(col3)可能會或可能不會爲你做,你可能會得到一個額外的col和工會等可能不喜歡它。 – ort11 2012-02-02 18:03:16

1

我這樣做在SQL Server:

-- Setup test data: 
declare @table table (
    col1 int, 
    col2 int, 
    col3 int 
) 
insert into @table values (10, 20, 30) 
insert into @table values (40, 50, 60) 
insert into @table values (40, 50, 80) 

-- Here's the query: 
select col1, col2, cast(min(col3) as varchar(10)) as col3 
from @table 
group by col1, col2 
having count(*) = 1 
union all 
select col1, col2, 'xx' as col3 
from @table 
group by col1, col2 
having count(*) > 1 

我想這假定您有沒有重複的行(其中所有字段是重複的),否則你就會有一個可能不正確「XX」。