sql-server - 从不同的两列中选择所有列

标签 sql-server group-by unique distinct

我需要在以下数据库中选择 * where distinct 'Rua' with different 'CP':

id      Rua                  Local           Conc       CP
81143   dos moinhos          Rio Tinto       Gondomar   0123
81142   dos Moinhos          Rio Tinto       Gondomar   4435
81141   dos Moinhos          Rio Tinto       Gondomar   4435

通过以下查询,我可以获得两列:

SELECT Rua, CP 
FROM  Codigo
GROUP BY Rua, CP
HAVING COUNT(*) = 1

但我想要所有的列。 SELECT * 返回 “列 'Codigo.id' 在选择列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中。”

所以我想到了这个答案:How do I (or can I) SELECT DISTINCT on multiple columns?

我没有选择接受的答案,因为我需要快速查询(这将用于 AJAX 搜索建议)。我使用了另一个高度赞成的答案。因此,我创建了以下查询:

SELECT * From Codigo
WHERE  (Rua,CP) IN (
   SELECT Rua, CP
   FROM   Codigo
   GROUP  BY Rua, CP
   HAVING COUNT(*) = 1 
);

返回在预期条件的上下文中指定的非 bool 类型的表达式,接近“,”错误。为什么它期望 WHERE 之后的 Rua 是 bool 值?在答案中,他们使用了看起来不是 bool 值的 saleprice

所以我的问题是如何选择所有包括具有相同RuaCP的行,但只有一次 (DISTINCT)?

最佳答案

SQL Server 不支持 (a,b) in (val1,val2) 语法

使用EXISTS检查对

SELECT *
FROM   Codigo C1
WHERE  EXISTS (SELECT 1
               FROM   Codigo C2
               WHERE  C1.Rua = C2.Rua
                      AND C1.CP = C2.CP
               HAVING Count(*) = 1); 

或使用COUNT() Over()窗口聚合函数统计每个Rua, CP组合的记录,过滤出计数为的组1 为每个不同的 CP 找到一个 Rua 行。

SELECT *
FROM   (SELECT *,
               Count(1)OVER(partition BY Rua, CP) AS cnt
        FROM   Codigo C1) A
WHERE  cnt = 1 

这将是我的首选方法,因为它比使用 EXISTS 更有效,优化器只需扫描/查找表一次

如果您不想重复记录,请使用 ROW_NUMBER()

SELECT *
FROM   (SELECT *,
               Row_Number()OVER(partition BY Rua, CP Order by id) AS RN
        FROM   Codigo C1) A
WHERE  RN = 1 

我已经使用 Id 列对重复记录进行了排序,并从重复项中选择了第一条记录。

关于sql-server - 从不同的两列中选择所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41649838/

相关文章:

sql-server - SSMS 2014 - 无法检索此请求的数据 - 未知属性 IsMemoryOptimized

sql-server - 在SSIS中,如何查找值的ID,如果不匹配,则插入值并返回ID

python-3.x - 使用 groupby 从 Dataframe 中堆积条形图

arrays - 有效地挑选一个唯一的号码

javascript - 多个下拉菜单按钮 - 仅打开单击的按钮

sql-server - 当分配的空间阻止您更改 Azure SQL 数据库层时,最好的方法是什么?

sql-server - NVARCHAR(MAX) 是否比 NVARCHAR(N) 消耗更多存储空间(物理大小)

c# - Linq: GroupBy 其 child.value 属性值

mysql - CakePHP Group By 字段每组只返回一个结果

c - gettimeofday clock_gettime 生成唯一编号的解决方法