如何在 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;
我的 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;