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