sales_data桌子:
create table sales_data
(
store int,
sales_year int,
sales_total float
);
sales_data資料:
| 店鋪 | 銷售年 | 銷售總額 |
|---|---|---|
| 1 | 2020 | 100 |
| 1 | 2021 | 120 |
| 1 | 2022 | 60 |
有問題的查詢sales_data:
select
sales_year,
sales_total,
case
when sales_year <> 2022
then row_number() over (partition by store order by sales_total)
end as rn
from
sales_data
order by
sales_year
結果(不需要):
| 銷售年 | 銷售總額 | rn |
|---|---|---|
| 2020 | 100 | 2 |
| 2021 | 120 | 3 |
| 2022 | 60 |
為什么row_number()從2開始?我怎樣才能讓它從1開始?我想保留所有銷售年份,所以我不能排除在哪里。
期望的結果:
| 銷售年 | 銷售總額 | rn |
|---|---|---|
| 2020 | 100 | 1 |
| 2021 | 120 | 2 |
| 2022 | 60 |
uj5u.com熱心網友回復:
ROW_NUMBER排名從 2 而不是 1 開始,因為它適用于您的所有資料。不顯示它并不意味著值 1 不會分配給 2022。
為了解決這個問題,您可以ROW_NUMBER通過在布林值上添加磁區來稍微扭曲您的排序sales_year = 2022,如下所示:
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
在此處查看演示。
uj5u.com熱心網友回復:
對于它的地獄,這是另一種(雖然我會說更糟)的方式來做到這一點。
不要為每個存盤創建兩個磁區,而是強制某些行在磁區中最后排序。
這樣,當您的 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 之前一樣。因此,ORDER BY 將 2022 的行放在所有其他行之后。
磁區比排序便宜,所以不要這樣做。這只是一個示例,以幫助澄清不能從 rowNumber 中“排除行”,但如果您控制包含行的位置,則隨后可以安全地忽略結果。
https://www.db-fiddle.com/f/24ZxTg91AWpkJwZqZa9Kxd/0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/514716.html
標籤:sqlsqlite
