SQL Server - 按两列选择不同的行

时间:2015-12-01 15:16:18

标签: sql sql-server sql-server-2012

我有以下格式

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,但这里仍然有重复。

我的问题是:我在查询核心中使用的逻辑(用于过滤掉2列的重复行),你会用另一种方式写出来吗?

使用SQL Server 2012

谢谢

5 个答案:

答案 0 :(得分:1)

你当然想做的是

SELECT DISTINCT Name, someString, theValue FROM myTable

或者如果你需要知道有多少次出现

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

答案 1 :(得分: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

答案 2 :(得分: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;

答案 3 :(得分:0)

您需要从select和group by语句中删除“theValue”。

您为个别名称/ someStrings正确拥有多个“theValue”。

答案 4 :(得分:0)

我建议将简单聚合作为最简单的方法:

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