MAX(TIMESTAMP) KEEP (DENSE_RANK LAST ORDER BY TIMESTAMP)
не имеет смысла. Он говорит: дайте мне максимальную временную метку, а в случае связей дайте мне их максимум. Вы также можете просто написать MAX(TIMESTAMP)
.
CONCAT(CONCAT(process_id, question_grp), question_id)
тоже странно. Это просто process_id || question_grp || question_id
.
Итак, у нас на самом деле есть
WITH t2 AS
(
SELECT
bpms_poc_acc_answer.*,
MAX(timestamp) OVER (PARTITION BY question_grp, question_id, process_id) AS highest
FROM bpms_poc_acc_answer
)
SELECT
process_id, question_id, question_grp, answer, version, type, author, timestamp,
process_id || question_grp || question_id AS pkey
FROM t2
WHERE highest = timestamp;
Это стандарт SQL, но конкатенация строк может опираться на пустую строку, и нулевое значение одинаково в Oracle. В MySQL вы можете использовать CONCAT_WS
для этого:
WITH t2 AS
(
SELECT
bpms_poc_acc_answer.*,
MAX(timestamp) OVER (PARTITION BY question_grp, question_id, process_id) AS highest
FROM bpms_poc_acc_answer
)
SELECT
process_id, question_id, question_grp, answer, version, type, author, timestamp,
CONCAT_WS('', process_id || question_grp || question_id) AS pkey
FROM t2
WHERE highest = timestamp;
Это должно работать с MySQL 8. Более ранние версии не содержат CTE и оконные функции, и вы должны написать вместо этого:
SELECT
process_id, question_id, question_grp, answer, version, type, author, timestamp,
CONCAT_WS('', process_id || question_grp || question_id) AS pkey
FROM bpms_poc_acc_answer
WHERE (question_grp, question_id, process_id, timestamp) IN
(
SELECT question_grp, question_id, process_id, MAX(timestamp)
FROM bpms_poc_acc_answer
GROUP BY question_grp, question_id, process_id
);