计算不同行和列的值的差值

Posted

技术标签:

【中文标题】计算不同行和列的值的差值【英文标题】: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 行的访问窗口值。 【参考方案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 以查看其工作原理。 如果这完全符合您的问题,您可以将答案标记为“已接受”

以上是关于计算不同行和列的值的差值的主要内容,如果未能解决你的问题,请参考以下文章

计算不同行和不同列的持续时间?

Python Pandas - 连接两个具有不同行数和列数的数据框

MySQL Select ID 出现在具有多个特定值的列的不同行上

SQL——SQL函数

在 Oracle PL/SQL 中,当列的其余值相等时,我可以交换表中两个不同行的同一列的值吗?

在Oracle SQL中从同一列的不同行中选择多个变量的值