LAG(...)IGNORE NULLS OVER(ORDER BY ....)

时间:2018-10-11 10:42:50

标签: sql oracle mariadb lag ignore

我有一个ORACLE SQL,在代码中有LAG(...)IGNORE NULLS OVER(ORDER BY ...),但是在尝试在SQL中为MariaDB使用它时出现错误。有人知道MariaDB有什么类似功能吗?

更新:

我从中提取的真实数据库的REWORK步骤没有正确的步骤号,因此需要将step_no绑定到具有MAIN作为步骤值的最后一行。如表示例中所示,require_results列的所有REWORK行都具有step_no 102,该行来自具有10/10/2018 01:00:03 Claim_ts的最后一个MAIN行。

示例代码:

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

FROM testTable

结果示例。

Example table

dbfiddle with code

2 个答案:

答案 0 :(得分:2)

MariaDB不支持IGNORE NULLS选项。但是,我们可以使用相关子查询(例如

)在MariaDB或MySQL中模拟LAG
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;

Demo

编辑:

您在更新的问题中期望的输出并不是真正的滞后,但是我们可以使用类似的逻辑来获取您想要的:

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;

Demo

答案 1 :(得分:0)

根据documentation,MariaDB不支持此选项:

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

似乎也不支持第三个参数,这是默认值。

对于替换,您应该提供示例数据和所需的结果。为特定数据提供解决方案更为简单。例如,如果您要填充的列正在增加(或者有时是NULL),那么累积最大值是最简单的解决方案:

max(col) over (order by othercol)