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