2014-07-05 212 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中执行此操作。