计算两个不相邻行之间的差异

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;

【讨论】:

以上是关于计算两个不相邻行之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

如何为行中的多个集合计算存储过程中两个日期之间的差异

计算两个 csv 文件之间差异的更快方法

如何计算不同时区的两个 NSDate 对象之间的天数差异?

Oracle - 两个表中两行之间的差异或变化

计算 distinct 和 join over distinct 之间的差异

SQLite如何计算同一张表的两个变量之间的差异[关闭]