2012-05-28 52 views
0

除了標籤,我想解決這個問題,如果可能的話。 我有這個表計數第一次出現外鍵

activity_type | value | date  | company_id 
network.new | 1  | 2011-10-08 | 1 
members.count | 3  | 2011-10-08 | 1 
network.new | 1  | 2011-10-10 | 2 
network.new | 1  | 2011-10-11 | 3 
members.count | 4  | 2011-10-11 | 2 
  • 這基本上是一個日誌活動。只有 每一次COMPANY_ID
  • 「MEMBERS_COUNT」活動 「network.new」後,才每COMPANY_ID出現,每 COMPANY_ID可以每天出現一次發生
  • 「network.new」活動發生。

我需要做一個線形圖,X軸爲日期,Y軸是兩件事情的數量:

  1. 許多company_ids如何有成員活動的每一天爲第一 時間(這是給我一個難的時間);
  2. 每個給定日期有多少人擁有network.new活動並且只有該活動 。

我試過的所有查詢都給了我一個假陽性列表,主要是因爲它計算每天都有'members_count'活動的company_id。

我希望,如果可能,創建一個查詢,給我date,first_time_members,new_company列爲create view目的。 我希望我的問題很清楚,不要傻,因爲我找不到任何看起來接近我的問題的任何地方。

[編輯]

由於我的英語真的很差,我不能讓自己清楚,我要去嘗試解釋痘痘更多:

我的客戶有一個網絡公司和他希望瞭解有多少 公司一天天地加入網絡,但有一個問題:一家公司 登錄網絡時,它只有一個完成 之一,當它也有註冊成員。所以他想知道,有多少公司進行「不完整」註冊以及多少註冊「完成」 。

奧利瓊斯先生把我放在正確的方向,我認爲我可以使用他強硬的我,但它還不正確。 感謝ollie Jones爲您的答案。像你這樣的答案讓我喜歡這個網站。

+1

你能給我們一個樣本結果。猜測你的意思是由會員和第一次。 –

回答

1

因此,使用同樣的方法奧利·瓊斯向我展示了我搞清楚: 首先,我需要日期的列表,其中「MEMBERS_COUNT」或「network.new」發生

SELECT date as current_date 
FROM activity_log ld 
WHERE `activity_type` in ('members_count', 'network.new') 
GROUP BY date 
ORDER BY date 

他們,我離開加入了第一次約會的公司列表出現

SELECT MIN(date) AS new_date, company_id 
FROM activity_log 
WHERE activity_type = 'network.new' 
GROUP BY company_id 
ORDER BY date 

也離開加入第一次有公司數量成員

SELECT min(date) as members_count_date, company_id 
FROM `activity_networks` WHERE `activity_type` = 'network.daily.members_count' 
GROUP BY company_id 
ORDER BY date 

然後a對新公司和首次統計會員的公司進行分組計數,按組日期排序。然後我有這個:

SELECT DATE(FROM_UNIXTIME(ld.date)) as curr_date, 
COUNT(DISTINCT(new_co)) as new_co, 
COUNT(DISTINCT(complete_co)) as complete 
FROM activity_log ld 
LEFT JOIN (SELECT date AS new_date, company_id as new_co 
FROM activity_networks 
WHERE activity_type = 'network.new' 
GROUP BY company_id 
ORDER BY date) nd ON (ld.date=nd.new_date) 
LEFT JOIN (SELECT min(date) as members_count_date, company_id as complete_co 
FROM `activity_log` WHERE `activity_type` = 'members_count' 
GROUP BY company_id 
ORDER BY date) mcd ON (mcd.members_count_date=ld.date) 
WHERE `activity_type` in ('members_count', 'network.new') 
GROUP BY DATE(FROM_UNIXTIME(ld.date)) 
ORDER BY ld.date 

獨特的功能是至關重要的,因爲沒有它的計數是不正確的。這並不完美。我名爲'new_co'的專欄應該只帶來不完整的註冊(不完整的手段,與註冊公司掛鉤的新註冊人),但這些信息仍然有用。

+0

我很高興你明白這一點。 –

1

我要堅持我的脖子出去猜猜你想要什麼。您要求「第一次有多少公司_會員每天都有活動」。在這方面,這是一個非常難以理解的陳述。

我認爲你的意思是這樣的:對於每一天,有多少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!我認爲關於這個問題的回家教訓是你要求的結果很難指定。一旦你確切地指定了你想要的內容,編寫一個查詢來獲得它是單調而重複的,但並不困難。

另一個小提示。您可以創建一些視圖以便您的查詢不那麼龐大。

+0

謝謝,這是有用的,但不完全是我所需要的。我知道了。 – Palantir