以下是我在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
答案 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}}。