2016-10-03 22 views
0

我正在使用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是錯誤的,因爲它只有 「機器人」
  • ID = 3是錯誤的,因爲它有「IOS」
+0

到目前爲止您嘗試過什麼?請顯示你的代碼。堆棧溢出不是一個代碼寫入服務 - 預計你已經嘗試解決這個問題(並顯示你的工作),並且可以準確指出你被困住的地方。 – alroc

+0

已經提交了4個答案@alroc。更多來:D –

+0

@alroc我正在做一個幾乎沒有文章的任務。我已經完成了第一個:只有來自Android的用戶通過count group by和單獨連接表。但是當我遇到第二篇文章時,我知道我的方式是錯誤的,我真的不知道使用什麼邏輯。 –

回答

2

我稱之爲set-set-set查詢。我想解決這個使用group byhaving,因爲這是表達這些條件非常靈活的方法:

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 
+0

謝謝你,我用'HAVING'沒有這麼多。 不知道這個有趣的數據過濾器中的多個條件。 –

2

試試這個:

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 
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') 
+0

這將排除Android以外的所有內容,這不是OP所要求的。 – jpw

1

嘗試這

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 
+0

編輯幷包含一個更多的方法(第一個) – Madhivanan

+0

這兩個查詢仍然會返回id 3;第一個原因是having子句應用在where之後,這意味着具有id 3的IOS的行已經被過濾掉了,這使得具有謂詞爲真。第二個也包括id 3,因爲無論是否包含IOS,計數都大於等於2。 – jpw

+0

你是對的。我現在發佈了一個新的解決方案 – Madhivanan

相關問題