【问题标题】: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 中图表的来源。

【问题讨论】:

    标签: sql oracle


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      相关资源
      最近更新 更多