使用查询从SQL表中选择子集
我有一个数据集,其中用户根据登录id提供服务(PC、笔记本电脑)。我只需要选择那些同时具有这两个服务的登录id,而不考虑服务类别 我尝试在loginID上使用带有分区的row_number(),但它不起作用。 这里我只想选择10014和10016,还有更多 我试过以下方法:使用查询从SQL表中选择子集,sql,sql-server,Sql,Sql Server,我有一个数据集,其中用户根据登录id提供服务(PC、笔记本电脑)。我只需要选择那些同时具有这两个服务的登录id,而不考虑服务类别 我尝试在loginID上使用带有分区的row_number(),但它不起作用。 这里我只想选择10014和10016,还有更多 我试过以下方法: select * from ( select *, ROW_NUMBER() Over(Partition by LoginID Order by LoginID) RowNumber from data a) as x w
select * from ( select *, ROW_NUMBER() Over(Partition by LoginID Order by LoginID) RowNumber from data a) as x where x.RowNumber > 1
但它只给了我第二排
您可以使用
cte
和计数(不同的服务代码)=2
(同时使用两种服务的用户)来查找适当的LoginID
,然后将其加入主表
with cte as (
select
LoginID
from data
group by LoginID
having count(distinct ServiceCode) = 2
)
select
*
from data d
join cte c
on d.LoginID = c.LoginID
如果
'PC'
和'Laptop'
是唯一可能的值,那么您只需要为每个LoginID
计算ServiceCode
的不同值:
SELECT LoginID
FROM data
GROUP BY LoginID
HAVING COUNT(DISTINCT ServiceCode) = 2
如果您只需要登录ID,请使用聚合:
select loginid
from data
where servicecode in (10, 11)
having count(distinct servicecode) = 2;
如果需要原始行,一种方法是exists
:
select d.*
from data d
where d.servicecode in (10, 11) and
exists (select 1
from data d2
where d2.servicecode in (10, 11) and
d2.loginid = d.loginid
);
也就是说,当另一个值存在时,获取具有10/11服务代码的登录的所有行