【问题标题】:Calculate the difference between the value in different rows and columns计算不同行和列的值的差值
【发布时间】:2011-12-29 06:25:20
【问题描述】:

请帮助我解决以下问题。 假设我有一个表名为 Data 3 行:Date1、Date2 和访问窗口。我需要计算访问窗口值。它应该是日期1的第(n+1)行和日期2的第n行的差。例如:Date1 的第 2 行值与 date2 值的第 1 行值之差除以 7。请帮助。

Table: Data
------------
Date1           Date2           VW
13-DEC-2011     15-DEC-2011     ?   
18-DEC-2011     16-DEC-2011     ?
21-DEC-2011     24-DEC-2011     ?

谢谢

【问题讨论】:

  • 您使用什么 DBMS?你的表中有某种主键吗? Date1 和 Date2 的数据类型是什么?你怎么知道第一行是哪一行?是 Date1 中值最低的那一行吗?
  • 我们使用Oracle 11g,数据类型为日期。它可以有主键,并且在 date1 中也可以有较小的日期。我只需要一个示例查询来检索访问窗口的值。这只是一个尚未实现的难题。
  • 你应该看看lead函数。它用于访问下一行的数据,因此您可以使用该值并计算当前行和下一行之间的差异。
  • 我们需要知道订购标准是什么。 Oracle 不保证行的顺序,所以需要指定一个排序标准。是 Date1 行吗?
  • 是的,它应该从 Date1 行计算,它应该显示所有 3 行的访问窗口值。

标签: sql oracle oracle11g


【解决方案1】:
select
  Date1, 
  Date2,
  lead(Date1) over (order by Date1) next_date1,
  ((lead(Date1) over (order by Date1)) - Date2)/7 as Diff
From DATA_TABLE

对于最后一行你不会得到任何 VW,因为没有 n+1 Date1。

lead(column) 函数从over 子句中指定的下一行返回column 参数的值。

您可以找到示例和其他类似功能here

UPDATE(回复问题评论 - 如何与另一列进行比较)

select 
  Date1,
  Date2,
  Diff,
  another_column,
  CASE 
    when Diff < another_column then 'it is lower'
    when Diff > another_column then 'it is higher'
    when Diff = another_column then 'are equal'
  END as comparation,
  CASE
    when round(diff -another_column,3) = 0 then 'almost equal'
    else 'definitely not equal'
  END as rounded_comparation
from(
    select
      Date1, 
      Date2,
      lead(Date1) over (order by Date1) next_date1,
      ((lead(Date1) over (order by Date1)) - Date2)/7 as Diff,
      another_column
    From DATA_TABLE
)

【讨论】:

  • 如何将除以 7 部分添加到此。它会检索表中所有行的值吗?还有一个查询,你能解释一下 Lead 函数在这种情况下是如何工作的吗?是的,由于该条件,最后一行不应检索任何值。非常感谢。
  • 我已经更新了我的答案;添加了一列 next_date1 以查看其工作原理。
  • 如果这完全符合您的问题,您可以将答案标记为“已接受”
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 2021-03-22
相关资源
最近更新 更多