Sql server 从许多数据中选择仅包含特定因素的数据

Sql server 从许多数据中选择仅包含特定因素的数据,sql-server,tsql,Sql Server,Tsql,我正在使用T-SQL 我有一个表:平台源的用户会话 我需要找到只使用Android和桌面的用户 数据示例: ID | Source | DateTime 1 | Android | 2016-06-01 1 | Desktop | 2016-06-01 2 | Android | 2016-06-02 3 | iOS | 2016-06-01 3 | Desktop | 2016-06-02 3 | Android | 2016-06-03 预期结果: ID = 1

我正在使用T-SQL

我有一个表:平台源的用户会话

我需要找到只使用Android和桌面的用户

数据示例:

ID | Source  | DateTime
 1 | Android | 2016-06-01
 1 | Desktop | 2016-06-01
 2 | Android | 2016-06-02
 3 | iOS     | 2016-06-01
 3 | Desktop | 2016-06-02
 3 | Android | 2016-06-03 
预期结果:

ID = 1
ID=2是错误的,因为它只有Android ID=3是错误的,因为它有IOS
我称之为集合内集合查询。我喜欢使用group by和HAVE来处理这个问题,因为这是一种非常灵活的表达这些条件的方法:

select id
from t
group by id
having sum(case when source = 'Android' then 1 else 0 end) > 0 and -- has Android
       sum(case when source = 'Desktop' then 1 else 0 end) > 0 and -- has Desktop
       sum(case when source not in ('Android', 'Desktop') then 1 else 0 end) = 0 -- has nothing else

我称之为集合内集合查询。我喜欢使用group by和HAVE来处理这个问题,因为这是一种非常灵活的表达这些条件的方法:

select id
from t
group by id
having sum(case when source = 'Android' then 1 else 0 end) > 0 and -- has Android
       sum(case when source = 'Desktop' then 1 else 0 end) > 0 and -- has Desktop
       sum(case when source not in ('Android', 'Desktop') then 1 else 0 end) = 0 -- has nothing else
试试这个:

SELECT Id 
FROM mytable
GROUP BY Id
HAVING COUNT(*) = COUNT(CASE WHEN Source='Android' THEN 1 END) + 
                  COUNT(CASE WHEN Source='Desktop' THEN 1 END) AND
       COUNT(CASE WHEN Source='Desktop' THEN 1 END) > 0 AND
       COUNT(CASE WHEN Source='Android' THEN 1 END) > 0 
试试这个:

SELECT Id 
FROM mytable
GROUP BY Id
HAVING COUNT(*) = COUNT(CASE WHEN Source='Android' THEN 1 END) + 
                  COUNT(CASE WHEN Source='Desktop' THEN 1 END) AND
       COUNT(CASE WHEN Source='Desktop' THEN 1 END) > 0 AND
       COUNT(CASE WHEN Source='Android' THEN 1 END) > 0 
尝试使用

Select * 
from yourtable a 
where a.source = 'Android' 
  and not exist (Select b.id 
                 from yourtable b 
                 where b.id = a.id and b.source <> 'Android')
尝试使用

Select * 
from yourtable a 
where a.source = 'Android' 
  and not exist (Select b.id 
                 from yourtable b 
                 where b.id = a.id and b.source <> 'Android')
试试这个

select id from your_table
group by id
having 
max(case when source in ('Android') then 1 else 0 end))=1
and
max(case when source in ('Desktop') then 1 else 0 end))=1
and count(distinct source)=2
试试这个

select id from your_table
group by id
having 
max(case when source in ('Android') then 1 else 0 end))=1
and
max(case when source in ('Desktop') then 1 else 0 end))=1
and count(distinct source)=2

到目前为止你尝试了什么?请出示你的密码。Stack Overflow不是一个代码编写服务-它期望您已经尝试解决问题并展示您的工作,并且能够准确指出您的困境。已经提交了4个答案@alroc。还有更多:D@alroc我正在做一项只有几篇文章的任务。我已经做了第一个:只有来自Android的用户才能使用count group by和join table。但是当我看到第二篇有2个来源的文章时,我明白我的方法是错误的,我真的不知道该用什么逻辑。@DaurenSergazin我不知道如何解析它comment@alroc不小心按了回车键。我试图解释为什么我没有这个查询的任何代码。到目前为止,您尝试了什么?请出示你的密码。Stack Overflow不是一个代码编写服务-它期望您已经尝试解决问题并展示您的工作,并且能够准确指出您的困境。已经提交了4个答案@alroc。还有更多:D@alroc我正在做一项只有几篇文章的任务。我已经做了第一个:只有来自Android的用户才能使用count group by和join table。但是当我看到第二篇有2个来源的文章时,我明白我的方法是错误的,我真的不知道该用什么逻辑。@DaurenSergazin我不知道如何解析它comment@alroc不小心按了回车键。我试图解释为什么我没有这个查询的任何代码。这将排除除Android以外的所有源代码,这不是OP要求的。这将排除除Android以外的所有源代码,这不是OP所要求的。编辑并首先包含一个方法。两个查询仍将返回id 3;第一个原因是having子句应用于where之后,这意味着id为3的IOS行已经被过滤掉,这使得having谓词为true。第二个还将包括id 3,因为无论是否包含IOS,计数都大于等于2。编辑并包括一个以上的方法第一个两个查询仍将返回id 3;第一个原因是having子句应用于where之后,这意味着id为3的IOS行已经被过滤掉,这使得having谓词为true。第二个也将包括id 3,因为无论是否包含IOS,计数都大于等于2。谢谢,我以前没有这么多。我不知道这么有趣的数据过滤器有多个条件。谢谢,我以前没有这么多。对于如此有趣的数据过滤器,不知道其中的多个条件。