具有 where 条件的窗口函数条件 row_number()

问题描述

我在 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

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

输出:

pc a b r
pc1 a1 b1 null
pc1 a2 b2 1
pc1 a3 b3 2

dbhere

,

我怀疑你想要一个有条件的总和:

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