在多个列上创建重复排名
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。
代码可以简化,具体取决于您使用的特定数据库。
我有如下数据,其中一个客户 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。
代码可以简化,具体取决于您使用的特定数据库。