2016-03-15 75 views
-3

下面是一个简单的例子就是我有我的BDD:在这种情况下使用GROUP BY有没有更好的选择?

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 
+0

你的结果的逻辑是什么?我可以想出很多方法来获得这些结果。 –

+0

我需要为CODE = SF获取所有联系人名称而不存在重复值。 – Quentin

+2

'SELECT distinct REF,NameContact,Code FROM MyTable WHERE CODE ='SF'' –

回答

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 
+0

我认为你应该在'Partition by'中添加'NameContact,CODE'并在'Order by'中加上'Ref' –

+0

从给出的例子来看,并不清楚哪组列是唯一的,而且恰巧是 – Caleth

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价值的工作,那么你应该也ROW_NUMBERPARTITION BY子句中添加CODE领域。

+2

你仍然希望对此使用'DISTINCT'。否则,你将有两个“塔塔”记录。 – Kidiskidvogingogin

+0

当我执行你的查询时,我的结果中有重复的值。我很好奇,但是OVER分区的目标是什么?我从来没有用过 – Quentin

+0

@Quentin你在查询中有'WHERE CODE ='SF''吗? –

3

由于您GROUP BY查询给你你想要的结果(和可以说是写此查询的最简单的方法),有一两件事可以做,以缓解上市多列的痛苦你SELECTGROUP BY是在SSMS对象浏览器中展开您的表格,然后将Columns文件夹拖到您的查询编辑器中,该列表将列出所有字段,逗号分隔。然后,你可以剪出你将要聚合/排除的人。

+2

我与SSMS合作过的所有这些年,我都不知道你能做到这一点!我总是右键单击并选择'Script table as ...',然后从结果中复制并粘贴列名。 –

+0

哇!大把戏从来不知道这一点 –

相关问题