Sql 滞后(…)忽略空值(按…排序)
我有一个ORACLE SQL,它有延迟。。。忽略订单上的空值。。。在代码中,但在尝试将其用于MariaDB的SQL时出错。有人知道MariaDB的类似功能吗 更新: 我从中提取的真实数据库没有用于返工步骤的正确步骤号,因此需要将步骤号绑定到具有MAIN作为步骤值的最后一行。如表示例中所示,所有返工行的“期望结果”列都有步骤102,这是从2018年10月10日01:00:03索赔的最后一个主行开始的 示例代码:Sql 滞后(…)忽略空值(按…排序),sql,oracle,mariadb,lag,ignore,Sql,Oracle,Mariadb,Lag,Ignore,我有一个ORACLE SQL,它有延迟。。。忽略订单上的空值。。。在代码中,但在尝试将其用于MariaDB的SQL时出错。有人知道MariaDB的类似功能吗 更新: 我从中提取的真实数据库没有用于返工步骤的正确步骤号,因此需要将步骤号绑定到具有MAIN作为步骤值的最后一行。如表示例中所示,所有返工行的“期望结果”列都有步骤102,这是从2018年10月10日01:00:03索赔的最后一个主行开始的 示例代码: WITH testTable AS ( SELECT '10/9/2018
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
从测试表
结果示例
根据,MariaDB不支持此选项:
MariaDB不支持忽略空值选项。但是,我们可以使用相关子查询模拟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;
您可能应该包括您的查询。即使MariaDB不支持IGNORE NULLS,也可能有一个解决方法。desired_results列似乎没有任何延迟。如果您想要帮助生成该列,您应该仔细解释那里发生了什么。我再次进行了更新,希望更清楚。我不确定如何更改id以使用时间戳。我用示例数据更新了我的帖子。@newbie_146我给了你一个选项来生成你想要的最新结果。
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;