LAG (...) IGNORE NULLS OVER (ЗАКАЗАТЬ ....) - PullRequest
0 голосов
/ 11 октября 2018

У меня есть ORACLE SQL, который имеет в коде LAG (...) IGNORE NULLS OVER (ORDER BY ...), но получаю сообщение об ошибке при попытке использовать его в SQL для MariaDB.Кто-нибудь знает, что похожая функция для MariaDB?

ОБНОВЛЕНИЕ:

Реальная база данных, из которой я извлекаю, не имеет правильных номеров шагов для шагов REWORK, поэтому необходимо связать step_no споследняя строка, которая имеет MAIN для значения шага.Как и в примере с таблицей, столбец required_results имеет значение step_no 102 для всех строк REWORK, которое относится к последней строке MAIN с 10/10/2018 01:00:03 demand_ts.

Пример кода:

WITH testTable AS (
     SELECT '10/9/2018 17:22:54' AS claim_ts, 'MAIN' AS step, '100' AS step_no, '100' as desired_results UNION ALL
     SELECT '10/9/2018 20:39:32', 'MAIN', '101', '101'   UNION ALL
     SELECT '10/10/2018 01:00:03', 'MAIN', '102', '102' UNION ALL
     SELECT '10/10/2018 01:01:44', 'REWORK', '5', '102' UNION ALL
     SELECT '10/11/2018 05:55:20', 'REWORK', NULL, '102' UNION ALL
     SELECT '10/11/2018 13:12:11', 'REWORK', '5', '102' UNION ALL
     SELECT '10/11/2018 16:45:00', 'REWORK', NULL, '102' UNION ALL
     SELECT '10/12/2018 03:08:25', 'MAIN', '103', '103'
)
SELECT
claim_ts,
step,
step_no,
desired_results

ОТ testTable

Пример результатов.

Example table

dbfiddle с кодом

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

MariaDB не поддерживает опцию IGNORE NULLS.Но мы можем смоделировать LAG в MariaDB или MySQL, используя коррелированный подзапрос, например,

SELECT
    id,
    col1,
    col2,
    (SELECT t2.col1 FROM yourTable t2
     WHERE t2.id < t1.id AND t2.col1 IS NOT NULL
     ORDER BY t2.id DESC LIMIT 1) col1_lag
FROM yourTable t1;

Демо

Редактировать:

Результат, который вы ожидаете в своем обновленном вопросе, на самом деле не запаздывает, но мы можем использовать аналогичную логику, чтобы получить то, что вы хотите:

SELECT
    claim_ts,
    step,
    step_no,
    desired_results,
    (SELECT t2.step_no FROM testTable t2
     WHERE t2.claim_ts <= t1.claim_ts AND t2.step = 'MAIN'
     ORDER BY t2.claim_ts DESC LIMIT 1) AS actual_results
FROM testTable t1;

Демо

0 голосов
/ 11 октября 2018

Согласно документации , MariaDB не поддерживает эту опцию:

LAG (expr[, offset]) OVER ( 
  [ PARTITION BY partition_expression ] 
  < ORDER BY order_list >
)

Также не поддерживается третий аргумент, который является значением по умолчаниюзначение.

Что касается замены, вы должны предоставить образцы данных и желаемых результатов.Проще предоставить решение для конкретных данных.Например, если столбец, который вы пытаетесь заполнить, увеличивается (или иногда NULL), то кумулятивный максимум является самым простым решением:

max(col) over (order by othercol)
...