题
我的老板给了我一项我不确定可能的任务,因为大约两周之后,我无法找到解决方案,所以我把它扔出来要求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地址的地址。
这是一个过于简单化的答案,但它得到了你的观点。它只返回“较小”的每个不同地址的名称。
您还需要使用字段串联来进行区分,但它会为您提供所需的内容。