簡體   English   中英

SQL Server-按兩列選擇不同的行

[英]SQL Server - select distinct rows by two columns

我有以下格式

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

謝謝

當然,您想做的是

SELECT DISTINCT Name, someString, theValue FROM myTable

或者,如果您需要知道發生了多少次,

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

根據您的預期輸出,該查詢可以簡單地完成為

SELECT DISTINCT Name, someString, theValue
FROM myTable

結果集將具有Name,someString和theValue的不同組合。

如果您還想要每個組合的數量,則可以將其實現為

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

這可能是一個漫長的過程,但是有關該問題的所有論述都表明這些重復實際上不是重復。 也許有一些引起麻煩的尾隨空格? 在這種情況下,應該可以執行以下操作: SELECT DISTINCT RTRIM(name), RTRIM(someString), theValue FROM myTable;

如果重復值是TheValue的問題,則可以嘗試使用:

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

您需要同時從select和group by語句中刪除“ theValue”。

對於單個名稱/ someStrings,您正確具有多個“ theValue”。

我建議使用簡單的匯總作為最簡單的方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM