1

我的老板给了我一个我不确定是否可行的任务,因为大约两周后,我无法找到解决方案,所以我把它扔掉,向 SO 小组寻求任何形式的帮助。如果这打破了你的大脑,我很抱歉。

先介绍一点背景知识:我们开发了一个数据库查询应用程序,它允许用户从数据库中取回他们想要的任何东西,而无需了解任何 SQL。

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

Bob Jones, 122 Main Street, Portland, OR
Sue Jones, 122 Main Street, Portland, OR
Mary Smith, 458 32nd Street, Portland, OR
Ralph Smith, 458 32nd Street, Portland, OR

我们希望它能够正常工作,以便只返回每个地址的第一行,如下所示:

Bob Jones, 122 Main Street, Portland, OR
Mary Smith, 458 32nd Street, Portland, OR

使用普通的 distinct,将返回所有四行,这比我们想要的要多。有没有人对我们如何去做这件事有任何想法?谢谢。

4

3 回答 3

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列列表,并指示您定义“第一个”项目的列列表。

(确保前面的语句以分号结束。)

于 2009-09-11T20:05:37.440 回答
3

您必须运行常规的“SELECT DISTINCT”sql 语句,该语句只查询实际需要不同的字段。然后,一旦您将其取回,运行另一个查询,该查询采用具有匹配数据的 TOP 1 记录来获取非不同字段。目前我没有看到在单个 SQL 语句中执行此操作的方法......

于 2009-09-11T20:00:24.863 回答
3

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

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

您还需要使用字段连接来进行区分,但它会为您提供所需的东西。

于 2009-09-11T20:04:18.160 回答