2017-10-25 2 views
0

난 이미 시도했습니다 전에 순위,BigQuery에 특정 문자열

DENSE_RANK()는

내가 "true"를하기 전에, TEAM_CD 순위를 할 온다. 좋아요!

TEAM_CD  RANK  
------------------- 
false  1   
true  2   
false  1  
false  2 
false  3  
true  4   
false  1   
true  2 

i 사용자 Bigquery, Legacy SQL !! 도와주세요 !!!! (나는 영어를 잘 쓰지 못한다 ....)

+0

이 순서를 정의하는 방법이 필요합니다. 행 번호와 같은 다른 열을 사용할 수 있습니까? 그렇지 않으면 그러한 쿼리를 작성할 수있는 방법이 없습니다. –

답변

1

Elliott이 언급했듯이, 순서를 정의 할 방법이 필요하다. 테이블에 정의 할 컬럼이 있어야합니다. orderable 유형의 모든 열이 될 수 있습니다. 쿼리 아래 당신이 무엇을 요구 할 것입니다

#standardSQL 
SELECT 
    pos, 
    team_cd, 
    DENSE_RANK() OVER(PARTITION BY grp ORDER BY pos) AS RANK 
FROM (
    SELECT 
    pos, 
    team_cd, 
    COUNTIF(team_cd) OVER(ORDER BY pos ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS grp 
    FROM `project.dataset.table` 
) 
-- ORDER BY pos 

당신은

다음과 같은 질문에서 dummydata를 사용하여 재생/테스트 할 수 있습니다 (이 BigQuery에 표준 SQL입니다) -
Asuming 테이블에 pos 열이있다 어떤 이유로 당신은 여전히 ​​BigQuery를 기존 SQL에 바인딩 된 경우
#standardSQL 
WITH `project.dataset.table` AS (
    SELECT 1 AS pos, FALSE AS team_cd UNION ALL 
    SELECT 2, TRUE UNION ALL 
    SELECT 3, FALSE UNION ALL 
    SELECT 4, FALSE UNION ALL 
    SELECT 5, FALSE UNION ALL 
    SELECT 6, TRUE UNION ALL 
    SELECT 7, FALSE UNION ALL 
    SELECT 8, TRUE 
) 
SELECT 
    pos, 
    team_cd, 
    DENSE_RANK() OVER(PARTITION BY grp ORDER BY pos) AS RANK 
FROM (
    SELECT 
    pos, 
    team_cd, 
    COUNTIF(team_cd) OVER(ORDER BY pos ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS grp 
    FROM `project.dataset.table` 
) 
ORDER BY pos 

, 아래 사용 (하지만 moving to Standard SQL을 고려 - 그것은 매우 BigQuery의 팀에 의해 권장) 할 수

#legacySQL 
SELECT 
    pos, 
    team_cd, 
    DENSE_RANK() OVER(PARTITION BY grp ORDER BY pos) AS RANK 
FROM (
    SELECT pos, team_cd, IFNULL(grp, 0) grp 
    FROM (
    SELECT 
     pos, 
     team_cd, 
     SUM(team_cd) OVER(ORDER BY pos ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS grp 
    FROM [project:dataset.table] 
) 
) 
ORDER BY pos