我有一个包含某些字符串的数据库,例如'{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种不同的自动收报机字符串。当然,逐个做它们是一种选择,但这是一个非常耗时的选择。
答案 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`