在这种情况下使用GROUP BY有没有更好的选择?
下面是一个简单的例子就是我有我的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
如果您有一个添加窗口行号的子查询,您可以选择第一个(或最后一个,或中位数等)行。
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
我认为你应该在'Partition by'中添加'NameContact,CODE'并在'Order by'中加上'Ref' –
从给出的例子来看,并不清楚哪组列是唯一的,而且恰巧是 – Caleth
您可以使用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_NUMBER
的PARTITION BY
子句中添加CODE
领域。
你仍然希望对此使用'DISTINCT'。否则,你将有两个“塔塔”记录。 – Kidiskidvogingogin
当我执行你的查询时,我的结果中有重复的值。我很好奇,但是OVER分区的目标是什么?我从来没有用过 – Quentin
@Quentin你在查询中有'WHERE CODE ='SF''吗? –
由于您GROUP BY
查询给你你想要的结果(和可以说是写此查询的最简单的方法),有一两件事可以做,以缓解上市多列的痛苦你SELECT
和GROUP BY
是在SSMS对象浏览器中展开您的表格,然后将Columns
文件夹拖到您的查询编辑器中,该列表将列出所有字段,逗号分隔。然后,你可以剪出你将要聚合/排除的人。
我与SSMS合作过的所有这些年,我都不知道你能做到这一点!我总是右键单击并选择'Script table as ...',然后从结果中复制并粘贴列名。 –
哇!大把戏从来不知道这一点 –
你的结果的逻辑是什么?我可以想出很多方法来获得这些结果。 –
我需要为CODE = SF获取所有联系人名称而不存在重复值。 – Quentin
'SELECT distinct REF,NameContact,Code FROM MyTable WHERE CODE ='SF'' –