Как обновить значение столбца только при первом изменении значения другого столбца, сгруппированного по двум различным столбцам? - PullRequest
0 голосов
/ 18 сентября 2018

Я работаю с H2 DB и имею имя схемы STUDENT и имя таблицы POS

POS таблица имеет следующие атрибуты:

ID_NUMBER : она уникальна для каждой строки. PARTITION_ID : Это уникально для каждого STUDENT_ID .Сбрасывается на 1 для нового STUDENT_ID . STDUENT_ID : просто идентификатор для каждого студента. ДЕЙСТВИЕ : поле, которое будет обновлено.Объяснено ниже УРОВЕНЬ : Академический уровень.1 означает старшекурсник и 2 для магистров. POS : Программа обучения

ID_NUMBER   || PARTITION_ID  || STUDENT_ID  || ACTION || LEVEL || POS   
 ---------------------------------------------------------------------
    1        || 1             || 8888        ||        || 1     || A
    2        || 2             || 8888        ||        || 1     || A
    3        || 3             || 8888        ||        || 1     || A
    4        || 4             || 8888        ||        || 1     || A 
    5        || 5             || 8888        ||        || 1     || B
    6        || 6             || 8888        ||        || 1     || C
    7        || 7             || 8888        ||        || 1     || C
    8        || 8             || 8888        ||        || 1     || C
    9        || 9             || 8888        ||        || 2     || D
    10       || 10            || 8888        ||        || 2     || E
    11       || 11            || 8888        ||        || 2     || E
    12       || 12            || 8888        ||        || 2     || E
    13       || 1             || 9999        ||        || 1     || B
    14       || 2             || 9999        ||        || 1     || A
    15       || 3             || 9999        ||        || 1     || A
    16       || 4             || 9999        ||        || 1     || A
    17       || 5             || 9999        ||        || 1     || B
    18       || 6             || 9999        ||        || 1     || B
    19       || 7             || 9999        ||        || 1     || B
    20       || 8             || 9999        ||        || 1     || B
    21       || 9             || 9999        ||        || 2     || D
    22       || 10            || 9999        ||        || 2     || D
    23       || 11            || 9999        ||        || 2     || D
    24       || 12            || 9999        ||        || 2     || D

Логика для обновления столбца действий:

Если POS изменяется между тем же уровнем, янеобходимо обновить столбец ACTION , указав CHANGE там, где произошло первое изменение.

Каким бы ни было последнее вхождение POS на том же уровне, должен быть помечен COMP

Таким образом, окончательный вывод должен быть таким, как показано ниже:

 ID_NUMBER   || PARTITION_ID  || STUDENT_ID  || ACTION || LEVEL || POS   
 ---------------------------------------------------------------------
    1        || 1             || 8888        ||        || 1     || A
    2        || 2             || 8888        ||        || 1     || A
    3        || 3             || 8888        ||        || 1     || A
    4        || 4             || 8888        ||        || 1     || A 
    5        || 5             || 8888        || CHANGE || 1     || B
    6        || 6             || 8888        || CHANGE || 1     || C
    7        || 7             || 8888        ||        || 1     || C
    8        || 8             || 8888        || COMP   || 1     || C
    9        || 9             || 8888        ||        || 2     || D
    10       || 10            || 8888        || CHANGE || 2     || E
    11       || 11            || 8888        ||        || 2     || E
    12       || 12            || 8888        || COMP   || 2     || E
    13       || 1             || 9999        ||        || 1     || B
    14       || 2             || 9999        || CHANGE || 1     || A
    15       || 3             || 9999        ||        || 1     || A
    16       || 4             || 9999        ||        || 1     || A
    17       || 5             || 9999        || CHANGE || 1     || B
    18       || 6             || 9999        ||        || 1     || B
    19       || 7             || 9999        ||        || 1     || B
    20       || 8             || 9999        || COMP   || 1     || B
    21       || 9             || 9999        ||        || 2     || D
    22       || 10            || 9999        ||        || 2     || D
    23       || 11            || 9999        ||        || 2     || D
    24       || 12            || 9999        || COMP   || 2     || D

Теперь я написал код SQL для достижения COMP статус.Это как показано ниже:

UPDATE STUDENT.POS AB
SET AB.ACTION = 'COMPLETE'
WHERE AB.PARTITION_ID =  (SELECT MAX(PARTITION_ID) 
FROM STUDENT.POS BC
WHERE BC.STUDENT_ID = AB.STUDENT_ID AND BC.LEVEL = AB.LEVEL) 

Мой вопрос состоит в том, как выполнить обновление статуса CHANGE только для первого случая изменения в пределах каждого академического уровня для каждого студента?

ПРИМЕЧАНИЕ. Я использую H2 DB, которая в настоящее время не поддерживает такие функции, как Partition By или Over!

Я попытался выполнить подзапрос.Примерно так:

UPDATE STUDENT.POS AB 
SET AB.ACTION = 'CHANGE' 
WHERE AB.PARTITION_ID =  (SELECT BC.PARTITION_ID
FROM UPDATE STUDENT.POS BC 
WHERE  BC.LEVEL = AB.LEVEL AND BC.POS != AB.POS) 
AND BC.STUDENT_ID = AB.STUDENT_ID

Хотя это приводит к ошибке: Скалярный подзапрос содержит более одной строки .По иронии судьбы, это то, чего я пытаюсь достичь, обновляя несколько строк для каждого уровня под каждым идентификатором студента.

...