SQL row_number() - 如何忽略空值?

SQL row_number() - how to ignore nulls?

我需要为用户添加计数器 activity,使用此查询:

select PERSON_ID, TIMESTAMP, 
  row_number() over (partition by  PERSON_ID order by  TIMESTAMP asc) as PERSON_COUNTER
from table1;

这很好用,但它也计算 PERSON_ID 为 null 的情况并分配计数器,就好像 null 是用户名一样。我想要的是在这些情况下计数器为空 - 有什么想法吗?

是的,您可以使用如下查询

select 
PERSON_ID, TIMESTAMP, CASE WHEN PERSON_ID IS NULL THEN NULL ELSE PERSON_COUNTER END AS PERSON_COUNTER
from
(
select PERSON_ID, TIMESTAMP, 
  row_number() over (partition by  PERSON_ID order by  TIMESTAMP asc) as PERSON_COUNTER
from table1
) t;

是的,计数器一直在计数,但您并不真正关心 PERSON_ID 为空的行的值。所以把它们扔掉

select PERSON_ID, 
       CASE PERSON_ID
         WHEN NULL THEN NULL
         ELSE PERSON_COUNTER
       END as PERSON_COUNTER
FROM (
  select PERSON_ID, TIMESTAMP, 
    row_number() over (partition by  PERSON_ID order by  TIMESTAMP asc) as PERSON_COUNTER
  from table1) T;

如果您根本不关心它们,甚至可以在同一级别添加 WHERE 子句以删除行

更好地过滤空值

      select PERSON_ID, TIMESTAMP, 
     row_number() over (partition by  PERSON_ID order by  
     TIMESTAMP asc) as PERSON_COUNTER
     from table1 where PERSON_ID IS NOT NULL;

没有子查询会更优雅:

select PERSON_ID, TIMESTAMP, 
  iff(PERSON_ID is null, null, row_number() over (partition by  PERSON_ID order by  TIMESTAMP asc)) as PERSON_COUNTER
from table1;