SQL根据某些逻辑重新分配秩
下面是示例表:SQL根据某些逻辑重新分配秩,sql,db2,Sql,Db2,下面是示例表:flg“E”表示现有,“N”表示“新” 样本数据: 要求: LOC_Rank b c d rownum flg 1 (null) (null) (null) 1 E 1 a b c 2 N 2 a b c 3 E 3
flg
“E”表示现有,“N”表示“新”
样本数据:
要求:
LOC_Rank b c d rownum flg
1 (null) (null) (null) 1 E
1 a b c 2 N
2 a b c 3 E
3 (null) (null) (null) 4 N
4 (null) (null) (null) 5 E
4 (null) (null) (null) 6 N
5 a b c 7 E
6 a1 b1 c1 8 N
7 a a c 9 E
7 a a c 10 N
案例1:如果flg
值E的a、c、d为空,则表中的秩1
也是如此
列和,对于表中的秩1
,如果flg
值N且没有空值,则loc\U秩应相同
情况2:如果flg
值E对于a、c、d没有空值,则表中的秩2
也是如此
对于表中的秩2
,如果flg
值N为空值,则loc_秩应更改为下一个递增值
情况3:如果flg
值E的a、c、d为空,则表中的秩3
也是如此
列和表中的秩3
,如果flg
值N为空值,则loc\u秩应相同
情况4:如果flg
值E对于a、c、d没有空值,则表中的秩4
也是如此
如果flg
值N且无空值,则表中列和的秩4
,但如果a、b、c在这两种情况下相同,则loc_秩应相同,否则下一个递增值
我想重新排列输出,如下所示
LOC_RANK b c d rownum flg
--------- ------ ------ ------ ------ ---
1 (null) (null) (null) 1 E
1 a b c 2 N
2 a b c 3 E
3 (null) (null) (null) 4 N
4 (null) (null) (null) 5 E
4 (null) (null) (null) 6 N
5 a b c 7 E
6 a1 b1 c1 8 N
7 a a c 9 E
7 a a c 10 N
您的问题的解决方案:
;with cte
AS
(
SELECT
T1.LOC_RANK AS LOC_RANK1,
T1.b AS b1,
T1.c AS c1,
T1.d AS d1,
T1.rownum AS rownum1,
T1.flg AS flg1,
T2.LOC_RANK AS LOC_RANK2,
T2.b AS b2,
T2.c AS c2,
T2.d AS d2,
T2.rownum AS rownum2,
T2.flg AS flg2,
CASE WHEN (T1.b IS NOT NULL AND T1.c IS NOT NULL AND T1.d IS NOT NULL)
AND (
(T2.b IS NULL AND T2.c IS NULL AND T2.d IS NULL)
OR
(T2.b IS NOT NULL AND T2.c IS NOT NULL AND T2.d IS NOT NULL
AND T1.b <> T2.b AND T1.c <> T2.c AND T1.d <> T2.d)
)
THEN 1
ELSE 0
END AS Change
FROM Table1 T1
INNER JOIN TABLE1 T2
ON T1.LOC_RANK = T2.LOC_RANK
AND T1.flg <> T2.flg AND T1.flg <> 'N'
)
, cte2
AS
(
SELECT
LOC_RANK1,
b1,
c1,
d1,
rownum1,
flg1,
LOC_RANK2,
b2,
c2,
d2,
rownum2,
flg2,
Change,
sum(Change) OVER(ORDER BY rownum2) AS cum_change
FROM cte
)
, finalcte
AS
(
SELECT
CASE WHEN LOC_RANK1 <> 1
THEN LOC_RANK1 + lag(cum_change) OVER (ORDER BY rownum1)
ELSE LOC_RANK1
END AS LOC_Rank,
b1 AS b,
c1 AS c,
d1 AS d,
rownum1 AS rownum,
flg1 AS flg
FROM
cte2
UNION ALL
SELECT
CASE WHEN LOC_RANK2 = 1
THEN
CASE WHEN CHANGE = 1
THEN LOC_RANK2 + CHANGE
ELSE LOC_RANK2
END
ELSE
LOC_RANK2 + cum_change
END AS LOC_RANK,
b2,
c2,
d2,
rownum2,
flg2
FROM
cte2
)
SELECT *
FROM finalcte
ORDER BY LOC_Rank, flg
演示链接:
……我想我更好奇的是,为什么您似乎关心所有空行。您没有考虑任何其他属性数据吗?我需要我的输出,因为这是我的业务需求@Clockwork Muse
LOC_Rank b c d rownum flg
1 (null) (null) (null) 1 E
1 a b c 2 N
2 a b c 3 E
3 (null) (null) (null) 4 N
4 (null) (null) (null) 5 E
4 (null) (null) (null) 6 N
5 a b c 7 E
6 a1 b1 c1 8 N
7 a a c 9 E
7 a a c 10 N