Как создать изменяющийся идентификатор группы в MariaDB - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть таблица в MariaDb, которая выглядит как следующая таблица, и мне нужно создать столбец «группа» (см. Вывод).Группа изменяется, если комбинация KEY_A и KEY_B изменяется в порядке LOAD_DATE (см. Вывод).Я не могу найти правильный SQL для генерации столбца «группа».

Может быть, у кого-то есть идея, как решить эту проблему в MariaDB?

TestData:

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

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я думаю, что это проблема пробелов и островков.

Вы можете решить это с помощью оконных функций:

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;
0 голосов
/ 14 февраля 2019

Ваши данные теста на самом деле записаны неправильно.

Данные теста:

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
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...