Sql server 如果有多个相同ID,则使用Where子句

Sql server 如果有多个相同ID,则使用Where子句,sql-server,tsql,Sql Server,Tsql,我有以下表格: ID | source | Name | Age | ... | ... 1 | SQL | John | 18 | ... | ... 2 | SAP | Mike | 21 | ... | ... 2 | SQL | Mike | 20 | ... | ... 3 | SAP | Jill | 25 | ... | ... 我希望每个ID都有一个记录。这背后的想法是,如果ID只出现一次(无论来源如何),那么将获取该记录。但是,如果一个

我有以下表格:

ID | source | Name | Age | ... | ...
1  | SQL    | John | 18  | ... | ...
2  | SAP    | Mike | 21  | ... | ...
2  | SQL    | Mike | 20  | ... | ...
3  | SAP    | Jill | 25  | ... | ...
我希望每个ID都有一个记录。这背后的想法是,如果ID只出现一次(无论来源如何),那么将获取该记录。但是,如果一个ID有两条记录,则包含SQL作为源的记录将是此处使用的记录

因此,在这种情况下,结果将是:

ID | source | Name | Age | ... | ...
1  | SQL    | John | 18  | ... | ...
2  | SQL    | Mike | 20  | ... | ...
3  | SAP    | Jill | 25  | ... | ...
我是通过一个分区来完成的(按Source desc排序),但是如果有一天添加第三个源代码,那就不太好用了

还有其他选择/想法吗?

您可以使用:


可以使用WITH TIES子句和窗口函数Row_Number()

最简单的方法(我认为)是使用带有排名功能的CTE:

with cte as
(
   select ID, source, Name, Age, ... , 
          rn = row_number() over (partition by ID order by case when source = 'sql'
                                                           then 0 else 1 end asc)
   from dbo.tablename
)
select ID, source, Name, Age, ...
from cte
where rn = 1
怎么样

SELECT * 
FROM table 
WHERE ID in (
   SELECT ID FROM test
   group by ID
   having count(ID) = 1)
OR source = 'SQL'

@伊佩尔切布ᵀᴹ 如果您知道,请随时链接到更好的资源。
with cte as
(
   select ID, source, Name, Age, ... , 
          rn = row_number() over (partition by ID order by case when source = 'sql'
                                                           then 0 else 1 end asc)
   from dbo.tablename
)
select ID, source, Name, Age, ...
from cte
where rn = 1
SELECT * 
FROM table 
WHERE ID in (
   SELECT ID FROM test
   group by ID
   having count(ID) = 1)
OR source = 'SQL'