排除row_NUMBER()中带大小写的行



sales_data表:

create table sales_data
(
store int,
sales_year int,
sales_total float
);

sales_data数据:

store
111

ROW_NUMBER排名从2开始,而不是1,因为它适用于所有数据。不显示它并不意味着值1不会分配给2022。

为了解决这个问题,您可以通过在布尔值sales_year = 2022上添加分区来稍微扭曲ROW_NUMBER排序,如下所示:

select 
sales_year,
sales_total,
case 
when sales_year <> 2022
then ROW_NUMBER() OVER (PARTITION BY store, sales_year=2022 ORDER BY sales_total) 
end as rn
from sales_data
order by sales_year

请在此处查看演示。

最糟糕的是,这里有另一种方法(尽管我会说更糟(。

与其为每个存储创建两个分区,不如强制某些行在分区内按最后排序。

这样,当CASE表达式"忽略"某些结果时,它们总是最后一行,因此不要在序列中留下"洞"。

select 
sales_year,
sales_total,
case 
when sales_year <> 2022
then row_number() over (partition by store order by sales_year = 2022, sales_total) 
end as rn
from 
sales_data
order by 
sales_year

注意:False在True之前,就像0在1之前一样。因此,ORDERBY将2022行放在所有其他行之后。

分区比排序便宜,所以不要这样做。这只是一个有助于澄清";排除行";from rowNumber不是一个选项,但如果您控制一行的包含位置,则可以安全地忽略结果。

https://www.db-fiddle.com/f/24ZxTg91AWpkJwZqZa9Kxd/0

最新更新