在这种情况下,是否有更好的替代方法来使用GROUP BY?

时间:2016-03-15 15:14:17

标签: sql sql-server sql-server-2008

以下是我在BDD中的简短示例:

Ref   | NameContact | CODE
SF005 | Toto        | SF
SF006 | Titi        | BC
SF005 | Toto        | SF
SF007 | Foo         | FB
SF006 | Bar         | BC
SF005 | Tata        | SF
SF005 | Tata        | SF

我喜欢这个:

Ref   | NameContact |CODE
SF005 | Toto        | SF
SF005 | Tata        | SF

我尝试使用DISTINCT,但它无法正常使用。当我对所有命名列和GROUP BY使用MAX()时,它可以正常工作。但是,我有很多列,查询非常大。有更好的解决方案吗?

SELECT MAX(Ref),NameContact,Code FROM MyTable WHERE CODE = 'SF' GROUP BY NameContact,Code

3 个答案:

答案 0 :(得分:3)

由于您的GROUP BY查询可以为您提供所需的结果(并且可以说是编写此查询的最简单方法),您可以做一件事来减轻列出SELECT中许多列的痛苦并且GROUP BY是在SSMS对象资源管理器中展开您的表格并将Columns文件夹拖到您的查询编辑器中,它将列出所有字段,为您分隔逗号。然后你可以删除你将要聚合/排除的那个。

答案 1 :(得分:2)

如果你有一个子查询添加一个窗口行号,你可以选择第一行(或最后一个,或中位数,或等...)行。

E.g。

SELECT Ref, NameContact, Code ... FROM 
    ( SELECT 
        Row-Number() OVER (PARTITION BY NameContact ORDER BY NameContact) AS RN,
        Ref, NameContact, Code ... 
    FROM MyTable
    WHERE CODE = 'SF') Windowed
WHERE RN = 1

答案 2 :(得分:1)

您可以使用ROW_NUMBER

SELECT Ref, NameContact, Code, ... rest of the fields
FROM (
  SELECT ROW_NUMBER() OVER (PARTITION BY NameContact
                            ORDER BY Ref DESC) AS rn,
         Ref, 
         NameContact,
         Code, 
         ... rest of the fields
  FROM MyTable 
  WHERE CODE = 'SF') AS t
WHERE t.rn = 1

这将为每个NameContact分区选择一个记录:具有最大Ref值的记录。

注意:如果您希望查询适用于任何CODE值,那么您还应在CODE PARTITION BY子句中添加ROW_NUMBER字段1}}。