返回所有Field和Distinct Rows

时间:2009-09-29 13:11:47

标签: sql sql-server tsql

在寻找不同的行时,最好的方法是什么?

SELECT DISTINCT name, address 
  FROM table;

我仍然希望返回所有字段,即address1,city等,但不包括在DISTINCT行检查中。

6 个答案:

答案 0 :(得分:2)

然后,当有多个行具有相同的值时,您必须决定要执行哪个行,您希望不同的检查要检查,但是使用不同的val;其他列中的ues。在这种情况下,查询处理器如何知道要输出的其他列中的多个值中的哪一个,如果您不关心,那么只需在distinct列上编写一个group by,其中包含Min()或Max()其他的..

编辑:我同意其他人的评论,只要你在同一个表中有多个依赖列(例如,Address1,Address2,City,State)这种方法会给你混合(因此不一致)的结果。如果表中的每个列属性是独立的(如果地址都在地址表中,并且此表中只有AddressId)那么它不是一个重要的问题...至少导致从连接到地址表的所有列将为同一地址生成日期,但您仍然可以随机选择一组多个地址...

答案 1 :(得分:1)

如果您有一组混合字段,其中一些是您想要显示的字段而另一些是您想要显示的字段,则需要聚合查询而不是DISTINCT。 DISTINCT仅用于返回相同字段集的单个副本。这样的事情可能有用:

SELECT name, 
       GROUP_CONCAT(DISTINCT address) AS addresses, 
       GROUP_CONCAT(DISTINCT city) AS cities
FROM the_table
GROUP BY name;

以上每个名称都会有一行。 addresses包含逗号分隔的字符串,该字符串包含该名称的所有地址一次。 cities对所有城市都做同样的事情。

但是,我没有看到此查询的结果如何有用。无法确定哪个地址属于哪个城市。

通常情况下,如果您尝试创建一个将以演示文稿所需的格式输出行的查询,那么最好不要接受多行,然后在应用程序层中处理查询结果。

答案 2 :(得分:1)

这不会混淆和匹配您的城市,州等,并且应该为您提供最后添加的内容:

select b.*
from (
    select max(id) id, Name, Address
    from table a
    group by Name, Address) as a
inner join table b
on a.id = b.id

答案 3 :(得分:0)

你可以做

SELECT DISTINCT Name, Address, Max (Address1), Max (City)
FROM table

<击>

使用下面的@JBrooks答案。他有更好的答案。

Return all Fields and Distinct Rows

答案 4 :(得分:0)

我认为你不能这样做因为它没有用。

name | address | city | etc...
abc  | 123     | def  | ...
abc  | 123     | hij  | ...

如果你要包括城市,但没有把它作为不同条款的一部分,除非你做了像Max(城市)这样的事情,否则城市的价值将是不可预测的。

答案 5 :(得分:0)

如果您使用的是SQL Server 2005或更高版本,则可以使用RowNumber函数。这将为您提供每个名称具有最低ID的行。如果您想要按更多列“分组”,请将它们添加到RowNumber的PARTITION BY部分。

SELECT id, Name, Address, ...
(select id, Name, Address, ...,  
    ROW_NUMBER() OVER (PARTITION BY Name ORDER BY id) AS RowNo
  from table) sub
WHERE RowNo = 1