mysql - 用于通过一个输出对多个字符串进行计数的 SQL 查询

标签 mysql sql string count ticker

我有一个包含某些字符串的数据库,例如“{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/

相关文章:

php - 如何仅更新和设置当前时间的所有行

c++ - 带有字符串和 bad_alloc 检查的构造函数

python - 在 pandas.DataFrame.str.replace 中组合多个正则表达式?

python - 计算可以从字符串组成的唯一字符串的数量

php - 选择总和大于某个数字的最小金额记录

mysql - 如何将普通sql转换为方解石avatica sql

php - 如何在 for 循环内获取给定月份所有天的记录总数

mySQL 获得 n 级附属机构

mysql - 如何从MySQL数据库中选择最新日期

sql - Snowflake 无法将变量值 "{TIMESTAMP VALUE}"转换为 TIMESTAMP_NTZ