从带有查询的SQL表中选择子集

时间:2019-06-09 20:30:47

标签: sql sql-server

我有一个数据集,用户可以在其中获取登录ID的服务(PC,笔记本电脑)。我只需选择具有两种服务的登录ID,而与服务类别无关。

我试图对登录ID的分区使用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

但是它只给我第二行。

enter image description here

3 个答案:

答案 0 :(得分:2)

您可以将ctecount(distinct serviceCode) = 2(同时具有两种服务的用户)一起使用,以找到正确的LoginID,然后将其join到主表中。

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

答案 1 :(得分:0)

如果'Laptop'ServiceCode是唯一可能的值,那么您只需要为每个LoginID计算SELECT LoginID FROM data GROUP BY LoginID HAVING COUNT(DISTINCT ServiceCode) = 2 的不同值:

[start:stop:step]

答案 2 :(得分:0)

如果只需要登录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服务代码的行用于登录。