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