如何不计算 DENSE_RANK() 中的 NULL 值?

csh*_*in9 4 sql google-bigquery

假设我有下表:

col
NULL
1
1
2
Run Code Online (Sandbox Code Playgroud)

然后我选择:

SELECT col, DENSE_RANK() OVER(ORDER BY col) as rnk from table
Run Code Online (Sandbox Code Playgroud)

然后我得到:

col  rnk
NULL 1
1    2
1    2
2    3
Run Code Online (Sandbox Code Playgroud)

我想要得到的是这样的:

col  rnk
NULL NULL
1    1
1    1
2    2
Run Code Online (Sandbox Code Playgroud)

但如果我查询:

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

然后我得到:

col  rnk
NULL NULL
1    2
1    2
2    3
Run Code Online (Sandbox Code Playgroud)

NULL除了使用子句之外,还有其他方法可以在排名时忽略 s 吗WHERE?我还有一些其他列,其行不能省略。

Gor*_*off 6

使用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;
Run Code Online (Sandbox Code Playgroud)