计算不同行和列的值的差值
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 出现在具有多个特定值的列的不同行上