计算每行之间的最近天数

奥托·沙瓦泽(Oto Shavadze)

给定这样的表(dt列是唯一的):

id | dt          | days_count
------------------------------
1  | 2015-06-01  |  NULL
2  | 2015-06-03  |  NULL
4  | 2015-06-09  |  NULL

我需要计算最接近的日期之间的间隔天数,并更新列中的检索结果days_count,并且计算必须从最新日期开始。也就是说,需要的结果是:

id | dt          | days_count
------------------------------
1  | 2015-06-01  |  NULL
2  | 2015-06-03  |  2
4  | 2015-06-09  |  6

我对此有2个变体:

  • 变体1

使用PL/SQL FOR (SELECT ..) LOOP,获取按行排序的每一行,dt desc并计算当前行日期和上一行日期之间的间隔天数。

  • 变体2

    MERGE INTO mytable
    USING(
      WITH
      t1 as (SELECT id, dt,  row_number() over(order by dt) as rn from mytable),
      t2 as (SELECT  id, dt,  row_number() over(order by dt) + 1 as rn from mytable)  
      SELECT  t1.id, t1.rn,  t1.dt - t2.dt as days_count  from   t1
      left JOIN  t2
      on
      t1.rn = t2.rn
    ) day_interval
    ON (mytable.id = day_interval.id)
    WHEN MATCHED THEN UPDATE SET
    mytable.days_count= day_interval.days_count
    

这些变体有效,但问题是:也许有更有效的方法吗?

拉利特·库马尔(Lalit Kumar B)

当您可以使用纯SQL进行操作时,切勿在PL / SQL中进行操作

您可以使用LAG()OVER()分析函数轻松完成此操作

例如,

设置

SQL> CREATE TABLE t
  2      (id int, dt date, days_count varchar2(4));

Table created.

SQL>
SQL> INSERT ALL
  2      INTO t (id, dt, days_count)
  3           VALUES (1, to_date('2015-06-01','YYYY-MM-DD'), NULL)
  4      INTO t (id, dt, days_count)
  5           VALUES (2, to_date('2015-06-03','YYYY-MM-DD'), NULL)
  6      INTO t (ID, dt, days_count)
  7           VALUES (4, to_date('2015-06-09','YYYY-MM-DD'), NULL)
  8  SELECT * FROM dual;

3 rows created.

SQL>

询问

SQL> SELECT id, dt, dt - lag(dt) over(order by dt) days_count FROM t;

        ID DT        DAYS_COUNT
---------- --------- ----------
         1 01-JUN-15
         2 03-JUN-15          2
         4 09-JUN-15          6

SQL>

合并声明

SQL> MERGE INTO t
  2      USING(
  3        SELECT id, dt, dt - lag(dt) over(order by dt) days_count FROM t
  4      ) day_interval
  5      ON (t.id = day_interval.id)
  6      WHEN MATCHED THEN UPDATE SET
  7      t.days_count= day_interval.days_count;

3 rows merged.

SQL> SELECT * FROM t;

        ID DT        DAYS
---------- --------- ----
         1 01-JUN-15
         2 03-JUN-15 2
         4 09-JUN-15 6

SQL>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

日期之间的天数计算

来自分类Dev

计算事件之间的平均天数?

来自分类Dev

计算事件之间的平均天数?

来自分类Dev

计算日期时间之间的天数

来自分类Dev

用小数计算日期之间的天数

来自分类Dev

计算两个日期之间的天数?

来自分类Dev

计算当天之间的总天数(SQL)

来自分类Dev

根据多种条件计算日期之间的天数

来自分类Dev

如何计算输入年份之间的天数

来自分类Dev

Excel:计算日期范围之间的平均天数

来自分类Dev

计算特定时间之间的天数

来自分类Dev

计算范围公式之间的周末天数

来自分类Dev

计算日期之间的天数,不同的月份

来自分类Dev

计算天数之间的收入 Oracle SQL

来自分类Dev

计算两个日期之间的天数

来自分类Dev

计算开票和收票之间的天数

来自分类Dev

如何计算每行之间的时间差(+/-)?

来自分类Dev

SQLite计算查询中YYYYMMDD日期格式之间的天数差异

来自分类常见问题

计算日期之间的天数,使用pyspark忽略周末

来自分类Dev

用PHP计算日期到今天之间的天数

来自分类Dev

计算JPA中两个日期之间的天数

来自分类Dev

计算Ruby中日期时间之间的平均天数

来自分类Dev

如何计算两个日期之间的天数

来自分类Dev

计算leap年中没有“额外”日期的日期之间的天数

来自分类Dev

计算java中两个日期之间的天数

来自分类Dev

Python如何计算两个日期之间的天数?

来自分类Dev

如何计算两个日期之间的天数

来自分类Dev

计算R中两个日期之间的天数

来自分类Dev

如何计算两个日期之间的星期天数