2017-10-25 20 views
0

私はすでに試した、BigQueryの、特定の文字列の前にランク

DENSE_RANK()(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 

は、あなたはそれが

以下のように、あなたの質問からダミーデータを使用してプレイする/テストすることができます(これはBigQueryの標準SQLのためです) -
Asumingテーブル内の posの列があります
#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 

それでもBigQueryのレガシーSQLにバインドされたいくつかの理由で、あなたは以下の使用(ただし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 
関連する問題