在多个列上创建重复排名

Creating duplicating rank over multiple columns

我有如下数据,其中一个客户 ID 有多个订单 (KEY),这是主键。我还有一个 activity 标志,如下所示(0 或 1)。

CUST_ID KEY FLAG
1       1   1
1       2   1
1       3   1
1       4   0
1       5   0
1       6   1
1       7   1
1       8   0
1       9   0

现在我想根据FLAG创建如下等级。这个想法是如果 FLAG 与前一行相同,则给予与前一行相同的排名。如果当前值与先前值不同,则排名递增。

CUST_ID KEY FLAG RN
1       1   1    1
1       2   1    1
1       3   1    1
1       4   0    2
1       5   0    2
1       6   1    3
1       7   1    3
1       8   0    4
1       9   0    4

我是 SQL 的新手,所以如果我需要重新设计问题,请告诉我。

使用LAG() window 函数获取每一行的前一个标志,然后使用SUM() window 函数创建排名:

SELECT CUST_ID, KEY, FLAG,
       SUM(CASE WHEN FLAG <> prev_FLAG THEN 1 END) OVER (PARTITION BY CUST_ID ORDER BY KEY) RN
FROM (
  SELECT *, LAG(FLAG, 1, FLAG - 1) OVER (PARTITION BY CUST_ID ORDER BY KEY) prev_FLAG
  FROM tablename
) t;

参见demo

代码可以简化,具体取决于您使用的特定数据库。