LAG(...) IGNORE NULLS OVER (ORDER BY...)
LAG(...) IGNORE NULLS OVER (ORDER BY....)
我有一个 ORACLE SQL 在代码中有 LAG(...) IGNORE NULLS OVER (ORDER BY ...) 但在 SQL 中尝试使用它时出现错误对于 MariaDB。有谁知道MariaDB有什么类似的功能吗?
更新:
我从中提取的真实数据库没有正确的 REWORK 步骤编号,因此需要将 step_no 绑定到具有 MAIN 作为步骤值的最后一行。在 table 示例中,desired_results 列的所有 REWORK 行都具有 step_no 102,这是来自最后一个 MAIN 行 10/10/2018 01:00:03 claim_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
来自测试表
结果示例。
根据documentation,MariaDB不支持这个选项:
LAG (expr[, offset]) OVER (
[ PARTITION BY partition_expression ]
< ORDER BY order_list >
)
它似乎也不支持第三个参数,这是一个默认值。
至于替换,您应该提供样本数据和期望的结果。为特定数据提供解决方案更简单。例如,如果您要填写的列在增加(或有时 NULL
),那么累积最大值是最简单的解决方案:
max(col) over (order by othercol)
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;
编辑:
您在更新后的问题中期望的输出并不是真正的滞后,但我们可以使用类似的逻辑来获得您想要的结果:
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;
我有一个 ORACLE SQL 在代码中有 LAG(...) IGNORE NULLS OVER (ORDER BY ...) 但在 SQL 中尝试使用它时出现错误对于 MariaDB。有谁知道MariaDB有什么类似的功能吗?
更新:
我从中提取的真实数据库没有正确的 REWORK 步骤编号,因此需要将 step_no 绑定到具有 MAIN 作为步骤值的最后一行。在 table 示例中,desired_results 列的所有 REWORK 行都具有 step_no 102,这是来自最后一个 MAIN 行 10/10/2018 01:00:03 claim_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
来自测试表
结果示例。
根据documentation,MariaDB不支持这个选项:
LAG (expr[, offset]) OVER ( [ PARTITION BY partition_expression ] < ORDER BY order_list > )
它似乎也不支持第三个参数,这是一个默认值。
至于替换,您应该提供样本数据和期望的结果。为特定数据提供解决方案更简单。例如,如果您要填写的列在增加(或有时 NULL
),那么累积最大值是最简单的解决方案:
max(col) over (order by othercol)
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;
编辑:
您在更新后的问题中期望的输出并不是真正的滞后,但我们可以使用类似的逻辑来获得您想要的结果:
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;