我有一个包含某些字符串的数据库,例如“{TICKER|IBM}”,我将其称为股票行情字符串。我的目标是计算多个字符串每天的股票行情数量。
我的数据库表“tweets”包含行“tweet_id”、“创建于”(dd/mm/yyyy hh/mm/ss) 和“已处理文本”。股票代码字符串(例如“{TICKER|IBM}”)位于“已处理文本”行内。
此时,我有一个有效的 SQL 查询来计算一个股票行情(感谢其他 Stackoverflow 用户的帮助)。我想要的是一个 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 多个不同的股票行情。当然,逐一进行也是一种选择,但这非常耗时。
最佳答案
如果我理解正确,您可以使用条件聚合来做到这一点:
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;
关于mysql - 用于通过一个输出对多个字符串进行计数的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24498047/