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'