2014-06-30 3 views
0

나는 'TICKER | IBM}'과 같이 특정 문자열을 포함하는 데이터베이스를 가지고 있는데, 여기에는 ticker-string으로 참조됩니다. 내 목표는 여러 문자열에 대해 매일 티커 문자열 양을 계산하는 것입니다.하나의 출력으로 여러 문자열 계산을위한 SQL 쿼리

내 데이터베이스 테이블 'tweets'에는 'tweet_id', 'created at'(dd/mm/yyyy hh/mm/ss) 및 'processed text'행이 포함됩니다. '{TICKER | IBM}'과 같은 티커 문자열은 '처리 된 텍스트'행에 있습니다.

이 순간에 나는 (다른 Stackoverflow-ers 덕분에) 하나의 티커 문자열을 계산하기위한 작업 SQL 쿼리를 가지고 있습니다. 내가 갖고 싶은 것은 여러 개의 문자열 ('{TICKER | IBM}'옆의 '{TICKER | GOOG}'및 '{TICKER | BAC}'옆에 여러 문자열을 집계 할 수있는 SQL 쿼리입니다.

다음

한 시세 문자열을 계산하기위한 작업 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 개 이상의 다른 증권 거래소 문자열을 가지고있다. 물론 하나씩 선택하는 것이 하나의 옵션이지만 시간이 많이 걸립니다. 만약 내가 제대로 이해하고

+0

당신이 찾고있는 용어는 '피봇'당신은 검색과 유래에의 사용을 많이 찾을 수 있어야합니다 (많은 열이 한 행에 몇 열에 여러 행을 돌려)입니다. 또는 두 – Twelfth

+0

조금 복잡하지만 피벗 테이블 쿼리를 작성하는 데 필요한 모든 시세 기호에 대해이 쿼리를 일반화하는 것이 좋다고 생각합니다. 또한 와일드 카드를 사용하여 '% {TICKER | IBM} % '은 (는) 테이블 짹짹에 대해 직렬 읽기를 강제 실행하고 성능을 저하시킵니다. 이 경우에는 LEFT (processed_text, Length ('{TICKER |')) = '{TICKER |' 시세 찾기. 그녀는 MySQL에서 동적 피벗 테이블의 예입니다 : http://stackoverflow.com/questions/12598120/mysql-pivot-table-query-with-dynamic-columns –

답변

1

, 조건부 집계하여이 작업을 수행 할 수 있습니다

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; 
+0

감사합니다 고든,이 완벽하게 작동합니다! 스크립트의 회사 이름을 입력하는 것은 100+ 티커 문자열을 수동으로 처리하는 것보다 시간이 적으므로 정말 감사하겠습니다 !! – Geoffrey

0

내가 이런 지정된 결과 집합을 반환 할 것, 각 "시세"에 대한 SELECT 목록에 식을 추가 난으로 반환하려는 별도의 칼럼 :

SELECT d.date 
     , IFNULL(SUM(t.processed_text LIKE '%{TICKER|IBM}%'),0) AS `cnt_ibm` 
     , IFNULL(SUM(t.processed_text LIKE '%{TICKER|GOOG}%'),0) AS `cnt_goog` 
     , IFNULL(SUM(t.processed_text LIKE '%{TICKER|BAC}%'),0) AS `cnt_goog` 
     , IFNULL(SUM(t.processed_text LIKE '%{TICKER|...}%'),0) AS `cnt_...` 
    FROM all_dates d 
    LEFT 
    JOIN tweets t 
     ON t.created_at >= d.date 
     AND t.created_at < d.date + INTERVAL 1 DAY 
    GROUP BY d.date 

참고하십시오 SUM 집계 내의 표현은 위의 논리 값으로 평가되는, 그래서 그들은 (true의 경우) 0 (false의 경우), 또는 NULL을 1을 반환합니다. I는 술어 (WHERE clause) that restricts the values of 날짜 being returned from all_dates`. 대안으로서

는 이와 같이 표현하는 제품 반환 첨가 특히 날짜() 함수에 created_at 열에 배치 피하고, 대신 다양한 검사를 사용하는 것 결과 :

 , SUM(IF(t.process_text LIKE '%{TICKER|IBM}%' ,1,0)) AS `cnt_ibm`