我要堅持我的脖子出去猜猜你想要什麼。您要求「第一次有多少公司_會員每天都有活動」。在這方面,這是一個非常難以理解的陳述。
我認爲你的意思是這樣的:對於每一天,有多少company_id值第一次出現在network.new活動類型中,並且有多少人在同一天伴隨有非零members.count項目,有多少不是?
這裏就是你要做的:
首先想到的一個查詢,將給予每家公司出現在你的系統中的第一次約會的。嘗試這個。
SELECT MIN(date) networknewdate, company_id
FROM table
WHERE activity_type = 'network.new'
GROUP BY company_id
這產生networknewdate,COMPANY_ID的虛擬表。
接下來,您需要一個查詢,將給予members.count項目變成了每家公司的第一次約會。
SELECT MIN(date) memberscountdate, company_id
FROM table
WHERE activity_type = 'members.count'
GROUP BY date
好了,現在我們有兩個很好的虛擬各有最多,每一列都COMPANY_ID值表。讓我們加入他們,推動第一個(network.new)價值的聯合。
SELECT a.networknewdate,
a.company_id,
IFNULL(b.members_present, 'no') members
FROM (
SELECT MIN(date) networknewdate, company_id
FROM table
WHERE activity_type = 'network.new'
GROUP BY company_id
) a
LEFT JOIN (
SELECT MIN(date) memberscountdate, company_id, 'yes' members_present
FROM table
WHERE activity_type = 'members.count'
GROUP BY date
) b ON (a.networknewdate = b.memberscountdate and a.company_id = b.company_id)
這將返回三列:日期,COMPANY_ID和「是」或「否」的說法是否有在同一天爲每個第一network.new記錄第一members.count記錄COMPANY_ID。
現在,你需要讓你得到每天一個記錄,用「是」的數量和上市「不」項目的數量來概括這件事。開始了。
的一天「是」的記錄數。
SELECT networknewdate, count(*) yesrecords
FROM (
SELECT a.networknewdate,
a.company_id,
IFNULL(b.members_present, 'no') members
FROM (
SELECT MIN(date) networknewdate, company_id
FROM table
WHERE activity_type = 'network.new'
GROUP BY company_id
) a
LEFT JOIN (
SELECT MIN(date) memberscountdate, company_id, 'yes' members_present
FROM table
WHERE activity_type = 'members.count'
GROUP BY date
) b ON (a.networknewdate = b.memberscountdate and a.company_id = b.company_id)
) r
WHERE r.members = 'yes'
GROUP BY networknewdate
按日期沒有記錄的數量是一個類似的查詢。然後,您需要在網絡更新中將這兩個查詢結合在一起,以便獲得日期表,yesrecords,norecords。我將把它作爲你的一個剪貼板練習。這是我寫在GROUP BY networknewdate
結尾的查詢的兩倍多。
歡迎使用實現真實世界業務邏輯的SQL!我認爲關於這個問題的回家教訓是你要求的結果很難指定。一旦你確切地指定了你想要的內容,編寫一個查詢來獲得它是單調而重複的,但並不困難。
另一個小提示。您可以創建一些視圖以便您的查詢不那麼龐大。
你能給我們一個樣本結果。猜測你的意思是由會員和第一次。 –