Просмотр истории удаления с последней версией - PullRequest
1 голос
/ 14 октября 2019

У меня есть эта таблица:

TABLE S_TEXT:

PS_TEXT     S_TEXT   VS_TEXT        D_TEXT  
1           1        1              Hey                 
2           1        1              Hello
3           1        2              Oh
4           2        1              Hallo
5           2        1              Hallo
6           2        2              Hi

Затем у меня есть это представление для удаления всех дублетов истории:

CREATE OR REPLACE VIEW `VHS_TEXT`
AS SELECT 
`S_TEXT`.`PS_TEXT`, 
`S_TEXT`.`S_TEXT`, 
`S_TEXT`.`VS_TEXT`, 
`S_TEXT`.`D_TEXT`
FROM 
`S_TEXT` LEFT JOIN 
`S_TEXT` AS `t2`
ON (
`S_TEXT`.`S_TEXT` = `t2`.`S_TEXT` AND `S_TEXT`.`PS_TEXT` < `t2`.`PS_TEXT`
)
WHERE
`t2`.`PS_TEXT` IS NULL;

ПРОСМОТР VHS_TEXT:

PS_TEXT     S_TEXT  VS_TEXT     D_TEXT  
3           1       2           Oh
6           2       2           Hi

Затем у меня есть это представление, чтобы показать версии без дублетов:

CREATE OR REPLACE VIEW `VVS_TEXT`
AS SELECT 
`S_TEXT`.`PS_TEXT`, 
`S_TEXT`.`S_TEXT`, 
`S_TEXT`.`VS_TEXT`, 
`S_TEXT`.`D_TEXT`
FROM 
`S_TEXT` LEFT JOIN 
`S_TEXT` AS `t2`
ON (
`S_TEXT`.`S_TEXT` = `t2`.`S_TEXT`
AND `S_TEXT`.`VS_TEXT` = `t2`.`VS_TEXT`
AND `S_TEXT`.`PS_TEXT` < `t2`.`PS_TEXT`
)
WHERE
`t2`.`PS_TEXT` IS NULL;

VIEW VVS_TEXT:

PS_TEXT     S_TEXT   VS_TEXT        D_TEXT  
2           1        1              Hello
3           1        2              Oh
5           2        1              Hallo
6           2        2              Hi

Теперь я вставляю один новый экземпляр строки 2 версии 1:

PS_TEXT     S_TEXT   VS_TEXT        D_TEXT  
1           1        1              Hey                 
2           1        1              Hello
3           1        2              Oh
4           2        1              Hallo
5           2        1              Hallo
6           2        2              Hi
7           2        1              Hi too

Теперь я получаю это в VHS_TEXT:

PS_TEXT     S_TEXT  VS_TEXT     D_TEXT  
3           1       2           Oh
7           2       1           Hi too

Но я хочу это:

 PS_TEXT    S_TEXT  VS_TEXT     D_TEXT  
 3          1       2           Oh
 6          2       2           Hi

Нужный запрос / представление можно определить следующим образом:

  • по одной строке для каждого отдельного S_TEXT
  • показать последнюю версию VS_TEXT для S_TEXT с последней редакцией PS_TEXT

1 Ответ

1 голос
/ 14 октября 2019

В MySQL 8.0 вы можете использовать row_number() для этого:

create view vhs_text as
select ps_text, s_text, vs_text, d_text 
from (
    select 
        s.*,
        row_number() over(partition by s_text order by vs_text desc) rn
    from s_text s
) x
where rn = 1

Демонстрация на БД Fiddle :

| ps_text | s_text | vs_text | d_text |
| ------- | ------ | ------- | ------ |
| 3       | 1      | 2       | Oh     |
| 6       | 2      | 2       | Hi     |

В более ранних версиях вы можете использовать условие NOT EXISTS с коррелированным подзапросом:

create view vhs_text as
select *
from s_text s
where not exists (
    select 1 
    from s_text s1
    where s1.s_text = s.s_text and s1.vs_text > s.vs_text
)

Демонстрация на DB Fiddle (тот же результат)

...