2014-07-05 2 views
0

나는 'tweets'라는 데이터베이스를 가지고 있습니다. 데이터베이스 'tweets'에는 'tweet_id', 'created at'(dd/mm/yyyy hh/mm/ss), 'classified'및 'processed text'행이 포함됩니다. '처리 된 텍스트'행에는 {TICKER | IBM}과 같은 특정 문자열이 있으며 여기에는 시세 문자열로 참조됩니다.SQL : 하루 평균 평균 값

내 목표는 티커 문자열 당 하루 평균 '분류'값을 얻는 것입니다. '분류 된'행은 숫자 값 -1, 0 및 1을 포함합니다. 이 시점에서 나는 일별 시세 표시 문자열에 대해 '분류'의 평균 값에 대한 작동중인 SQL 쿼리를 사용합니다. 아래 스크립트를 참조하십시오. {| IBM TICKER}

  1. 이 같은 제로 'processed_text 년대가 있었다있는 일을 포함하지 않습니다

    SELECT Date(`created_at`) , AVG(`classified`) AS Classified 
        FROM `tweets` 
        WHERE `processed_text` LIKE '%{TICKER|IBM}%' 
        GROUP BY Date(`created_at`) 
    

    그러나이 스크립트 두 가지 문제가 있습니다. 그러나 나는이 경우에 가치 0을 뱉어 내고 싶다.

  2. 나는 100 개 이상의 서로 다른 티커 문자열을 가지고 있으므로 동시에 여러 문자열을 처리 할 수있는 스크립트를 갖고 싶어합니다. 나도 수작업으로 그들을 하나씩 할 수는 있지만, 이것은 나에게 엄청난 시간을 요구할 것이다. 내가 시세 문자열 당 '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 점을 계산할 수있는 방법을 보여줄 수 있습니까?

답변

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을 참조하십시오.