Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用查询从SQL表中选择子集_Sql_Sql Server - Fatal编程技术网

使用查询从SQL表中选择子集

使用查询从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

我有一个数据集,其中用户根据登录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 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服务代码的登录的所有行