我的老板给了我一项我不确定可能的任务,因为大约两周之后,我无法找到解决方案,所以我把它扔出来要求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,将返回所有四行,这比我们想要的更多。有没有人对我们如何做到这一点有任何想法?感谢。

有帮助吗?

解决方案

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地址指定要分组的列列表, ORDER BY ID 表示您定义“第一个”列的列表。项目与。

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

其他提示

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top