[英]SQL: Average value per day
我有一個名為“ tweets”的數據庫。 數據庫“ 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;
該腳本非常適合計算每個報價字符串的tweet_ids。 但是,正如我所說的,我並不是要查找每個股票行情的平均分類分數。 因此,我的問題是:有人可以告訴我如何調整此腳本,以便我可以計算每天每個報價行的平均classified
分數嗎?
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數據透視表 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.