2014-07-05 210 views
0

我有一個名爲'tweets'的數據庫。數據庫的'tweets'包括(其中包括)'tweet_id','創建於'(dd/mm/yyyy hh/mm/ss),'classified'和'processed text'。在「已處理的文本」行中,存在某些字符串,例如{TICKER | IBM}',我將其稱爲ticker-strings。SQL:每天的平均值

我的目標是獲得每天每個ticker-string「分類」的平均值。 「分類」行包含數值-1,0和1. 此時,我有一個正在運行的SQL查詢,用於每天一個ticker-string的'classified'的平均值。請參閱下面的腳本。

SELECT Date(`created_at`) , AVG(`classified`) AS Classified 
    FROM `tweets` 
    WHERE `processed_text` LIKE '%{TICKER|IBM}%' 
    GROUP BY Date(`created_at`) 

然而,有兩個問題與此腳本:

  1. 它不包括在其中有零「processed_text的像天{TICKER | IBM}。然而,我希望它在這種情況下吐出零值。
  2. 我有100多個不同的ticker-strings,因此想要有一個腳本可以同時處理多個字符串。我也可以一個一個地手動完成它們,但這會花費我很多時間。

當我有每股票串計數「tweet_id的一個類似的問題,別人使用以下建議:

SELECT d.date, coalesce(IBM, 0) as IBM, coalesce(GOOG, 0) as GOOG, 
coalesce(BAC, 0) AS BAC 
FROM dates d LEFT JOIN 
(SELECT DATE(created_at) AS date, 
     COUNT(DISTINCT CASE WHEN processed_text LIKE '%{TICKER|IBM}%' then tweet_id 
       END) as IBM, 
     COUNT(DISTINCT CASE WHEN processed_text LIKE '%{TICKER|GOOG}%' then tweet_id 
       END) as GOOG, 
     COUNT(DISTINCT CASE WHEN processed_text LIKE '%{TICKER|BAC}%' then tweet_id 
       END) as BAC 
    FROM tweets 
    GROUP BY date 
) t 
ON d.date = t.date; 

這個腳本完美工作了計算每股票串的tweet_ids。正如我所說,我不想看到每個股票的字符串的平均分類分數。因此我的問題是:有人能告訴我如何調整這個腳本,以便我可以計算每天每個ticker-string的平均classified分數?

回答

0
SELECT d.date, t.ticker, COALESCE(COUNT(DISTINCT tweet_id), 0) AS tweets 
FROM dates d 
LEFT JOIN 
    (SELECT DATE(created_at) AS date, 
      SUBSTR(processed_text, 
        LOCATE('{TICKER|', processed_text) + 8, 
        LOCATE('}', processed_text, LOCATE('{TICKER|', processed_text)) 
        - LOCATE('{TICKER|', processed_text) - 8)) t 
ON d.date = t.date 
GROUP BY d.date, t.ticker 

這將把每個股票放在自己的行,而不是一列。如果您希望將它們移動到列中,則必須旋轉結果。你如何做到這一點取決於數據庫管理系統。有些具有創建數據透視表的內置功能。其他人(例如MySQL)不會,你必須編寫棘手的代碼來完成它;如果您提前知道所有可能的值,這並不難,但如果它們可以更改,則必須在存儲過程中編寫動態SQL。

請參閱MySQL pivot table瞭解如何在MySQL中執行此操作。