我有一个名为'tweets'的数据库。数据库'推文'包括(其中包括)行'tweet_id','创建于'(dd / mm / yyyy hh / mm / ss),'分类'和'已处理文本'。在“已处理的文本”行中,有一些字符串,例如{TICKER | IBM}',我将其称为自动收报机字符串。
我的目标是每天获得每个自动收报机字符串的“分类”平均值。 “分类”行包括数值-1,0和1。 此时,我有一个有效的SQL查询,用于每天一个自动收报机字符串的'已分类'的平均值。请参阅下面的脚本。
SELECT Date( `created_at` ) , AVG( `classified` ) AS Classified
FROM `tweets`
WHERE `processed_text` LIKE '%{TICKER|IBM}%'
GROUP BY Date( `created_at` )
此脚本存在两个问题:
当我有一个类似的问题来计算'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;
这个脚本非常适合计算每个ticker-string的tweet_ids。正如我所说,我不打算找到每个自动收报机字符串的平均分类分数。我的问题是:有人可以告诉我如何调整这个脚本,以便我可以计算每天每个自动收报机字符串的平均classified
分数吗?
答案 0 :(得分: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
这会将每个自动收报机放在自己的行上,而不是列。如果要将它们移动到列,则必须转动结果。如何执行此操作取决于DBMS。有些具有用于创建数据透视表的内置功能。其他人(例如MySQL)没有,你必须编写棘手的代码才能做到这一点;如果您提前了解所有可能的值,那么它并不太难,但如果它们可以更改,则必须在存储过程中编写动态SQL。
有关如何在MySQL中执行此操作,请参阅MySQL pivot table。