2014-09-12 3 views
2

저는 SQL (및 모든 종류의 코딩)의 완전한 초보자입니다.하지만 처음으로 로그인 한 사용자의 수를 국가별로 반환하는 기본 쿼리를 작성하려고합니다. 8 월 15 일 이후, 그리고 첫 번째 세션 다음날 다시 온 사용자의 수입니다.SQL 보존 쿼리

utc_timestamp, name, id 및이 이벤트에 대한 여러 매개 변수가 포함 된 json 문자열입니다 (볼 수 있듯이, 나는 그것을 검색하는 데 사용하고 있습니다. 세션 번호 및 국가)

이 쿼리를 실행하면 "Line 5 : 함수 사양에서 'SELECT' 'DISTINCT' 'id'근처의 입력을 인식 할 수 없습니다. select와 DISTINCT 사이에 대괄호를 넣으려고했는데 여전히 같은 오류 메시지가 계속 나타납니다. 그것을 일으키는 것에 대한 어떤 생각? 당신의 도움이들

SELECT 
get_json_object(json, '$. User_Country ') AS country 
, COUNT(DISTINCT id) AS Users 
, COUNT(
    SELECT DISTINCT id 
    FROM events 
    WHERE EXISTS(
     SELECT * 
     FROM events 
     WHERE name = "Logged_in" 
     AND utc_timestamp>(
      (
      SELECT utc_timestamp 
      FROM events 
      WHERE month = 201408 
      AND name = "Logged_in" 
      AND get_json_object(json, '$. Session_nb ') = 0 
      AND utc_timestamp > UNIXTIMESTAMP('2014-08-15 12:00:00') 
      ) + INTERVAL '1 day' 
     ) 
    ) 
) AS Retained1 
FROM events 
WHERE month = 201408 
AND name = "Logged_in" 
AND get_json_object(json, '$. Session_nb ') = 0 
AND utc_timestamp > UNIXTIMESTAMP('2014-08-15 12:00:00') 
GROUP BY (get_json_object(json, '$. User_Country ')) 
ORDER BY (get_json_object(json, '$. User_Country ')) 
+0

'기본 쿼리'에 대한 정의가 마음에 들었습니다 .-) 어떤 DBMS를 사용하고 있습니까? MySQL, MS SQL Server, PostgreSQL, ...? 질문을 수정하고 태그를 추가 할 수 있습니다. – Josien

+0

예 죄송합니다. 도구 faq가 실제로 hiveql인지 확인해야했습니다. – QuiZzer

+0

'EXISTS' 부질의 색인 된 열을 선택하면 더 나은 성능을 얻을 수 있습니다. 당신이하고있는 것처럼 모든 열 ('SELECT * FROM events')을 선택하는 대신'SELECT id FROM events'와 같은 것입니다. MS SQL Server에서'SELECT '1'FROM events'을 할 것입니다 - RDBMS가 지원하는지 모르겠습니다. –

답변

1

에 대한

덕분에 서브 쿼리 결과를 계산하지 마십시오. 대신 서브 쿼리 자체에 COUNT을 사용하십시오.

SELECT 
get_json_object(json, '$. User_Country ') AS country 
, COUNT(DISTINCT id) AS Users 
, (
    SELECT COUNT(DISTINCT id) 
    FROM events 
    WHERE EXISTS(
     SELECT * 
     FROM events 
     WHERE name = "Logged_in" 
     AND utc_timestamp>(
      (
      SELECT utc_timestamp 
      FROM events 
      WHERE month = 201408 
      AND name = "Logged_in" 
      AND get_json_object(json, '$. Session_nb ') = 0 
      AND utc_timestamp > UNIXTIMESTAMP('2014-08-15 12:00:00') 
      ) + INTERVAL '1 day' 
     ) 
    ) 
) AS Retained1 
FROM events 
WHERE month = 201408 
AND name = "Logged_in" 
AND get_json_object(json, '$. Session_nb ') = 0 
AND utc_timestamp > UNIXTIMESTAMP('2014-08-15 12:00:00') 
GROUP BY (get_json_object(json, '$. User_Country ')) 
ORDER BY (get_json_object(json, '$. User_Country ')) 
+0

감사하지만 여전히 비슷한 오류 메시지가 나타납니다. "Line 5 : 'SELECT'COUNT ''('표현식 사양'에서 입력을 인식 할 수 없습니다. 하지만 분명히 그 사실을 알게 된 이후로 작업 할 다른 것들이 있습니다. DBMS는 INTERVAL 명령을 지원하지 않습니다. – QuiZzer