代码之家  ›  专栏  ›  技术社区  ›  Tom A RRUZ

如何重新定义distinct

  •  1
  • Tom A RRUZ  · 技术社区  · 15 年前

    我的老板给了我一个我不确定是否可行的任务,因为大约两周后,我找不到解决方案,所以我放弃这个任务,向SO小组寻求任何帮助。如果这伤了你的大脑,我道歉。

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

    我的问题是:我们想定制使用“独特”选择的方式。我们不希望将distinct关键字应用于选定的行,而是希望它只应用于某些字段,以便使用与字段匹配的第一行。举个例子:

    Bob Jones,波特兰大街122号,或
    Sue Jones,波特兰大街122号,或
    玛丽·史密斯,波特兰32街458号,或
    拉尔夫·史密斯,波特兰第32街458号,或

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

    Bob Jones,波特兰大街122号,或
    玛丽·史密斯,波特兰32街458号,或

    使用normal distinct,将返回所有四行,这超出了我们的需要。有人知道我们该怎么做吗?谢谢。

    3 回复  |  直到 15 年前
        1
  •  5
  •   Mehrdad Afshari    15 年前
    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 指示用于定义“第一个”项的列列表。

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

        2
  •  3
  •   David    15 年前

    您必须运行一个常规的“select distinct”SQL语句,该语句只查询实际需要不同的字段。然后,一旦您返回这些字段,运行另一个查询,该查询将获取具有匹配数据的前1条记录,以获取非唯一字段。目前我在一条SQL语句中找不到这样做的方法…

        3
  •  3
  •   Chris J    15 年前

    从x group by address中选择min(a.firstname+a.lastname),地址。

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

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