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;
我需要为用户添加计数器 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;