用于使用一个输出计数多个字符串的SQL查询

时间:2014-06-30 19:59:39

标签: mysql sql string count ticker

我有一个包含某些字符串的数据库,例如'{TICKER | IBM}',我将其称为自动收报机字符串。我的目标是计算多个字符串每天的自动收报机字符数量。

我的数据库表'推文'包括行'tweet_id','创建于'(dd / mm / yyyy hh / mm / ss)和'已处理文本'。股票代码字符串,例如“{TICKER | IBM}”,位于“已处理文本”行中。

此时,我有一个有效的SQL查询来计算一个自动收录器字符串(感谢其他Stackoverflow-ers的帮助)。我想要的是一个SQL查询,我可以在其中计算多个字符串(例如“{TICKER | IBM}”旁边的“{TICKER | GOOG}”和“{TICKER | BAC}”)。

计算一个自动收报机字符串的工作SQL查询如下:

SELECT d.date, IFNULL(t.count, 0) AS tweet_count
FROM all_dates AS d
LEFT JOIN (
    SELECT COUNT(DISTINCT tweet_id) AS count, DATE(created_at) AS date
    FROM tweets
    WHERE processed_text LIKE '%{TICKER|IBM}%'
    GROUP BY date) AS t
ON d.date = t.date

因此,最终输出应该为列提供日期,列为{TICKER | IBM},列为{TICKER | GOOG},列为{TICKER | BAC}。

我想知道这是否可行以及您是否有解决方案?我有超过100种不同的自动收报机字符串。当然,逐个做它们是一种选择,但这是一个非常耗时的选择。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以使用条件聚合执行此操作:

SELECT d.date, coalesce(IBM, 0) as IBM, coalesce(GOOG, 0) as GOOG, coalesce(BAC, 0) AS BAC
FROM all_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;

答案 1 :(得分:0)

我会像这样返回指定的结果集,为每个“ticker”的SELECT列表添加表达式,我希望将其作为单独的列返回:

   SELECT d.date
        , IFNULL(SUM(t.processed_text LIKE '%{TICKER|IBM}%' ),0) AS `cnt_ibm`
        , IFNULL(SUM(t.processed_text LIKE '%{TICKER|GOOG}%'),0) AS `cnt_goog`
        , IFNULL(SUM(t.processed_text LIKE '%{TICKER|BAC}%' ),0) AS `cnt_goog`
        , IFNULL(SUM(t.processed_text LIKE '%{TICKER|...}%' ),0) AS `cnt_...`
     FROM all_dates d
     LEFT
     JOIN tweets t
       ON t.created_at >= d.date
      AND t.created_at < d.date + INTERVAL 1 DAY
    GROUP BY d.date

注意:上面SUM聚合中的表达式被评估为布尔值,因此它们返回1(如果为真),0(如果为假)或NULL。我会避免将created_at列包装在DATE()函数中,而是使用范围扫描,尤其是在添加了谓词的情况下(WHERE clause) that restricts the values of date being returned from all_dates`。

作为替代方案,像这样的表达式将返回相同的结果:

     , SUM(IF(t.process_text LIKE '%{TICKER|IBM}%' ,1,0)) AS `cnt_ibm`