如何在 MariaDB 中创建不断变化的组标识符

How to create changing group identifier in MariaDB

我的 MariaDb 中有一个 table,它看起来像下面的 table 并且需要创建 "group" 列(参见输出)。 如果 KEY_A 和 KEY_B 的组合按 LOAD_DATE 的顺序更改,则组会更改(请参阅输出)。 我找不到合适的 SQL 来生成 "group" 列。

也许有人知道如何在 MariaDB 中解决这个问题?

测试数据:

CREATE OR REPLACE TABLE test AS 
SELECT 'AAA' AS KEY_A,'A' AS KEY_B,DATE('2010-01-01') AS LOAD_DATE
UNION
SELECT 'AAA' AS KEY_A,'B' AS KEY_B,DATE('2010-01-02') 
UNION
SELECT 'AAA' AS KEY_A,'A' AS KEY_B,DATE('2010-01-03') 
UNION
SELECT 'AAA' AS KEY_A,'A' AS KEY_B,DATE('2010-01-04') 
UNION
SELECT 'BBB' AS KEY_A,'C' AS KEY_B,DATE('2010-01-04') 
UNION
SELECT 'CCC' AS KEY_A,'D' AS KEY_B,DATE('2010-01-04') ;

输出:

KEY_A; KEY_B; LOAD_DATE;  group

AAA;   A;     2010-01-01;  1
AAA;   B;     2010-01-02;  2
AAA;   A;     2010-01-03;  3
AAA;   A;     2010-01-04;  3
BBB;   C;     2010-01-04;  1
CCC;   D;     2010-01-04;  1

你的测试数据实际上写错了。

测试数据:

CREATE TABLE TestDB.test AS 
SELECT 'AAA' AS KEY_A,'A' AS KEY_B, DATE('2010-01-01') AS LOAD_DATE FROM DUAL
UNION
SELECT 'AAA' AS KEY_A,'B' AS KEY_B, DATE('2010-01-02') AS LOAD_DATE FROM DUAL
UNION
SELECT 'AAA' AS KEY_A,'A' AS KEY_B, DATE('2010-01-03') AS LOAD_DATE FROM DUAL
UNION
SELECT 'AAA' AS KEY_A,'A' AS KEY_B, DATE('2010-01-04') AS LOAD_DATE FROM DUAL
UNION
SELECT 'BBB' AS KEY_A,'C' AS KEY_B, DATE('2010-01-04') AS LOAD_DATE FROM DUAL
UNION
SELECT 'CCC' AS KEY_A,'D' AS KEY_B, DATE('2010-01-04') AS LOAD_DATE FROM DUAL
;

我认为这是一个缺口和孤岛问题。

你可以用window函数解决这个问题:

select t.*,
       sum( case when key_b = prev_key_b then 0 else 1 end ) over (partition by key_a order by load_date) as grp
from (select t.*,
             lag(key_b) over (partition by key_a order by load_data) as prev_key_b
      from t
     ) t;