sales_data
表:
create table sales_data
(
store int,
sales_year int,
sales_total float
);
sales_data
数据:
store | |||||
---|---|---|---|---|---|
1 | 1 | 1 |
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