如何重新定义Distinct

时间:2009-09-11 19:56:34

标签: sql-server dynamic-sql

我的老板给了我一项我不确定可能的任务,因为大约两周之后,我无法找到解决方案,所以我把它扔出来要求SO的任何帮助组。如果这打破了你的大脑,我道歉。

首先介绍一下:我们开发了一个数据库查询应用程序,允许用户从数据库中获取他们想要的任何内容,而无需知道任何SQL。

我的问题:我们想要自定义使用“Distinct”选项的方式。我们希望它仅应用于某些字段,而不是将distinct关键字应用于所选行,以便使用与字段匹配的第一行。举个例子:

Bob Jones,122 Main Street,Portland,OR Sue Jones,122 Main Street,Portland,OR 玛丽史密斯,458 32nd Street,Portland,OR Ralph Smith,458 32nd Street,Portland,OR

我们希望这样做,以便只返回每个地址的第一行,如下所示:

Bob Jones,122 Main Street,Portland,OR 玛丽史密斯,458 32nd Street,Portland,OR

使用正常的distinct,将返回所有四行,这比我们想要的更多。有没有人对我们如何做到这一点有任何想法?感谢。

3 个答案:

答案 0 :(得分:5)

WITH NumberedRows AS (
   SELECT FirstName, LastName, Address,
          ROW_NUMBER() OVER (PARTITION BY Address ORDER BY Id) as RowNumber
   FROM Table
) SELECT FirstName, LastName, Address
  FROM NumberedRows
  WHERE RowNumber = 1;

PARTITION BY Address指定要分组的列列表,ORDER BY ID表示您定义“第一个”项目的列列表。

(确保前一个语句以分号结束。)

答案 1 :(得分:3)

您必须运行常规的“SELECT DISTINCT”sql语句,该语句仅查询实际需要区分的字段。然后,一旦你得到它们,运行另一个查询,获取具有匹配数据的TOP 1记录,以获得非不同的字段。目前我没有在单个SQL语句中看到这样做的方法...

答案 2 :(得分:3)

SELECT MIN(a.firstname + a.lastname),来自x Group By地址的地址。

这是一个过于简单化的答案,但它得到了你的观点。它将仅返回每个不同地址的“较小”名称。

您还需要使用字段串联来进行区分,但它会为您提供所需的内容。