计算两个不相邻行之间的差异
Posted
技术标签:
【中文标题】计算两个不相邻行之间的差异【英文标题】:Calculate difference between two non-adjacent rows 【发布时间】:2017-11-17 11:36:21 【问题描述】:如何根据表中另一个字段中的值计算表中两行之间的时间差。 表(简化)的样子;
Unit Date Status
0001 17.11.2017 09:52 INSPECTED
0001 17.11.2017 09:48 CLEAN
0001 17.11.2017 09:45 CLEANING
0001 17.11.2017 09:43 DIRTY
0001 16.11.2017 14:55 INSPECTED
0001 16.11.2017 14:54 CLEAN
0001 16.11.2017 12:54 CLEANING
0001 16.11.2017 12:22 DIRTY
0001 16.11.2017 12:20 CLEAN
0001 15.11.2017 10:48 CLEAN
0001 15.11.2017 10:27 CLEANING
0001 15.11.2017 09:03 DIRTY
日期字段的类型为 DATE,单位和状态值来自父表。
基于列状态,我必须为每一天和每个单元计算状态 DIRTY 和下一个状态 CLEAN 之间的差异。应产生示例数据;
0001 17.11.2017 00:05
0001 16.11.2017 02:32
0001 15.11.2017 01:45
查询是 Oracle APEX 中图表的来源。
【问题讨论】:
【参考方案1】:您不需要自加入 - 您可以使用 LEAD
解析函数:
SELECT unit,
"Date",
NUMTODSINTERVAL( Clean_date - "Date" =, 'DAY' ) AS difference
FROM (
SELECT t.*,
LEAD( CASE status WHEN 'CLEAN' THEN "Date" END )
IGNORE NULLS
OVER ( PARTITION BY unit --, TRUNC( "Date" )
ORDER BY "Date" ASC ) AS Clean_date
FROM your_table t
)
WHERE status = 'DIRTY';
【讨论】:
FWIW,通过在子查询中添加where status in ('CLEAN', 'DIRTY')
可以提高性能,因为 OP 似乎并不关心任何其他状态。【参考方案2】:
试试这个。
SELECT a.unit,
TRUNC (a.Date_t),
TO_CHAR (
EXTRACT (HOUR FROM NUMTODSINTERVAL (a.Date_t - b.Date_t, 'DAY')),
'FM00')
|| ':'
|| TO_CHAR (
EXTRACT (
MINUTE FROM NUMTODSINTERVAL (a.Date_t - b.Date_t, 'DAY')),
'FM00')
diff
FROM (SELECT *
FROM yourtable
WHERE status = 'CLEAN') a
JOIN (SELECT *
FROM yourtable
WHERE status = 'DIRTY') b
ON a.unit = b.unit AND TRUNC (a.Date_t) = TRUNC (b.Date_t)
ORDER BY 2 DESC;
【讨论】:
以上是关于计算两个不相邻行之间的差异的主要内容,如果未能解决你的问题,请参考以下文章