2016-09-28 7 views
2

は、私は、次の表を持って言ってやるがいい。DENSE_RANK()でNULL値をカウントしない方法は?

col 
NULL 
1 
1 
2 

は、それから私は選択します。

SELECT col, DENSE_RANK() OVER(ORDER BY col) as rnk from table 

それから私は得る:

col rnk 
NULL 1 
1 2 
1 2 
2 3 

私は何を取得したいことはこれです:

col rnk 
NULL NULL 
1 1 
1 1 
2 2 

しかし、I q ueryで:

SELECT col, CASE WHEN col IS NOT NULL THEN DENSE_RANK() OVER(ORDER BY col) END as rnk from table 

は、それから私は得る:

col rnk 
NULL NULL 
1 2 
1 2 
2 3 

WHERE句を使用するよりも、他のランキングNULL Sを、無視する方法はありますか?行を省略できない他の列があります。

+0

BQまたはTeradataのためにありますか?彼らは非常に異なっています。タグ正しく! –

+0

BQが標準SQLをサポートするようになりました。 – cshin9

+0

"標準SQL" <> "Teradata SQL" –

答えて

4

使用partition by

以下
SELECT col, 
     (CASE WHEN col IS NOT NULL 
      THEN DENSE_RANK() OVER (PARTITION BY (CASE WHEN col IS NOT NULL THEN 1 ELSE 2 END) 
            ORDER BY col 
            ) 
     END) as rnk 
FROM table; 
+1

- この回答はBigQuery Standard SQL –

+0

@MikhailBerlyantです。 。 。このクエリは、私が知る限り、 'dense_rank()'をサポートするSQLエンジンで動作します。 –

+0

では使用できませんが、従来のSQLではPARTITION BYとしてBigQueryのLegacy SQL:o)では使用できません。 –

0

は、BigQueryのレガシーSQL

SELECT col, CASE WHEN col IS NOT NULL THEN rnk END AS rnk 
FROM (
    SELECT 
    col, (col IS NULL) AS tmp, 
    DENSE_RANK() OVER(PARTITION BY tmp ORDER BY col) AS rnk 
    FROM table 
) 
関連する問題