2015-12-01 57 views
0

選擇不同行,我有以下格式SQL服務器 - 兩列

Name someString  theValue 
abc bla bla   3 
abc bla bla   3 
abd bla bla   5 
abd bla bla   5 
xfz ffs ds ds  50 
xfz ffs ds ds  50 

預期的結果:

Name someString  theValue 
abc bla bla   3 
abd bla bla   5 
xfz ffs ds ds  50 

嘗試使用此查詢解決我的問題:

Select Name, someString, theValue count(*) FROM myTable 
     GROUP BY Name, someString, theValue 
      HAVING count(*) = 1 

這裏的邏輯是:向每行添加一個計數編號,並且只選擇每組行計數的第一個。

這使我的結果從2160行縮減到40,但這裏仍然有重複。

我的問題是:是我在查詢corect中使用的邏輯(用於篩選出2列重複的行),並且您是否以其他方式編寫了這些?

使用SQL Server 2012的

謝謝

+2

爲什麼你就不能使用'選擇DISTINCT'? 「價值」在哪裏起作用? – Siyual

+1

你的邏輯是不正確的,因爲你只需要一個組,但你的'HAVING count(*)= 1'只選擇只有一行存在的組。你想要每個組的第一個,但沒有訂單欄。什麼決定了第一個?嘗試了 –

+0

。如果我使用'從myTable'中選擇分隔符*,我將返回相同數量的'2160'行。 @Siyual – CM2K

回答

0

我會建議一個簡單的彙總作爲最簡單的方法:

select name, someString, min(theValue) as theValue 
from t 
group by name, someString; 
1

當然,你想要做的是

SELECT DISTINCT Name, someString, theValue FROM myTable 

或者,如果你需要知道有多少occurances然後

SELECT Name, someString, theValue, Count(*) as ct FROM myTable GROUP BY Name, someString, theValue 
1

由於根據您的預期輸出,此查詢可以簡單地完成爲

SELECT DISTINCT Name, someString, theValue 
FROM myTable 

resultset將具有Name,someString,theValue的不同組合。

如果你也想每個組合的計算,那麼你可以實現它作爲

SELECT Name, someString, theValue, count(*) combination_count 
FROM myTable 
GROUP BY Name, someString, theValue 
0

這可能是一個長鏡頭,但你寫了關於這一問題的所有建議,這些重複實際上不是重複。也許有一些尾隨空間會造成麻煩?在這種情況下,下面應該工作: SELECT DISTINCT RTRIM(name), RTRIM(someString), theValue FROM myTable;

如果有重複的問題是theValue,你可以嘗試使用:

SELECT DISTINCT name, someString, first_value(theValue) over (partition by name, someString) FROM myTable;

+0

除非它們實際上具有奇怪的設置,否則帶尾部空格的值將與不帶值的值一起分組/清除。 –

+0

如果空格是一個問題,您想要使用RTRIM(LTRIM())刪除所有尾隨和預先佔用的空間。 –

0

你需要從刪除「theValue」既選擇並按語句分組。

對於單個名稱/ someStrings,您正確擁有多個「theValue」。

+0

但我需要選擇列'theValue'。這就是這一點。 – CM2K