Window 带where条件的函数(条件row_number())
Window function with where condition (conditional row_number())
我在 select 语句中有以下子句
ROW_NUMBER() OVER(
PARTITION BY pc
ORDER BY
a DESC, b DESC
) r
我如何才能将该函数仅应用于满足特定条件但不过滤 where 子句末尾的 selection 的行? .
示例数据:
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
null
pc1
a3
b3
2
编辑:我试过下面的方法,但它不是从 1 开始,而是从整个 rownum 计数开始。
CASE
WHEN condition THEN
ROW_NUMBER() OVER(
PARTITION BY pc
ORDER BY
a, b
)
END r1
我怀疑你想要一个有条件的总和:
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
在“case when”语句中使用 row_number(),在“partition by”中使用第二个 case 语句,如下所示:
(Case condition when true then ROW_NUMBER() OVER(
PARTITION BY (case condition when true then pc end)
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
dbhere
如果条件是 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
)
end)r
from sampledata order by a, b desc
输出:
pc
a
b
r
pc1
a1
b1
null
pc1
a2
b2
1
pc1
a3
b3
2
dbhere
我在 select 语句中有以下子句
ROW_NUMBER() OVER(
PARTITION BY pc
ORDER BY
a DESC, b DESC
) r
我如何才能将该函数仅应用于满足特定条件但不过滤 where 子句末尾的 selection 的行? .
示例数据:
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 | null |
pc1 | a3 | b3 | 2 |
编辑:我试过下面的方法,但它不是从 1 开始,而是从整个 rownum 计数开始。
CASE
WHEN condition THEN
ROW_NUMBER() OVER(
PARTITION BY pc
ORDER BY
a, b
)
END r1
我怀疑你想要一个有条件的总和:
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
在“case when”语句中使用 row_number(),在“partition by”中使用第二个 case 语句,如下所示:
(Case condition when true then ROW_NUMBER() OVER(
PARTITION BY (case condition when true then pc end)
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
)
end)r
from sampledata order by a, b desc
输出:
pc | a | b | r |
---|---|---|---|
pc1 | a1 | b1 | null |
pc1 | a2 | b2 | 1 |
pc1 | a3 | b3 | 2 |
db