问题描述
我在 select 语句中有以下子句
ROW_NUMBER() OVER(
PARTITION BY pc
ORDER BY
a DESC,b DESC
) r
如何仅将该函数应用于满足特定条件但不过滤 where 子句末尾的选择的行? .
示例数据:
PC | A | B |
---|---|---|
pc1 | a1 | b1 |
pc1 | a2 | b2 |
pc1 | a3 | b3 |
所需的输出(本例中的条件是 a2!='a2'):
PC | A | B | R |
---|---|---|---|
pc1 | a1 | b1 | 1 |
pc1 | a2 | b2 | 空 |
pc1 | a3 | b3 | 2 |
编辑:我尝试了下面的方法,但它不是从 1 开始,而是从整个 rownum 计数开始。
CASE
WHEN condition THEN
ROW_NUMBER() OVER(
PARTITION BY pc
ORDER BY
a,b
)
END r1
解决方法
在 case when 语句中使用 row_number() 如下:
(Case condition when true then ROW_NUMBER() OVER(
PARTITION BY pc
ORDER BY
a DESC,b DESC
)
end)r
示例:
create table sampledata(PC varchar(10),A varchar(10),B varchar(10));
insert into sampledata values('pc1','a1','b1');
insert into sampledata values('pc1','a2','b2');
insert into sampledata values('pc1','a3','b3');
查询:
select *,(Case when A<>'a2' then ROW_NUMBER() OVER(
PARTITION BY (case when A<>'a2' then pc end)
ORDER BY a,b DESC
)
end)r
from sampledata order by a,b desc
输出:
pc | a | b | r |
---|---|---|---|
pc1 | a1 | b1 | 1 |
pc1 | a2 | b2 | null |
pc1 | a3 | b3 | 2 |
db
如果条件是 A'a1' 那么
查询:
select *,(Case when A<>'a1' then ROW_NUMBER() OVER(
PARTITION BY (case when A<>'a1' then pc end)
ORDER BY a,b desc
输出:
pc | a | b | r |
---|---|---|---|
pc1 | a1 | b1 | null |
pc1 | a2 | b2 | 1 |
pc1 | a3 | b3 | 2 |
db
我怀疑你想要一个有条件的总和:
SUM(CASE WHEN <condition> THEN 1 ELSE 0 END) OVER (
PARTITION BY pc
ORDER BY a DESC,b DESC
) as r
如果您希望 NULL
用于不匹配的值:
(CASE WHEN <condition>
THEN SUM(CASE WHEN <condition> THEN 1 ELSE 0 END) OVER (
PARTITION BY pc
ORDER BY a DESC,b DESC
)
END) as r