在比较下一条记录的 Date1 和当前记录的 Date2 时查询列出记录

Posted

技术标签:

【中文标题】在比较下一条记录的 Date1 和当前记录的 Date2 时查询列出记录【英文标题】:Query to list records while Comparing Date1 of Next record with Date2 of Current Record 【发布时间】:2015-07-03 07:47:57 【问题描述】:

假设我有包含以下列的“Employee_Sal”表:

Employe_Sal ( wage_No, From_Date, To_Date, Amt)

No  | From_Date |    TO_Date |   AMT 
1 ____01/7/2015  ____25/7/2015___40000
2 ____26/7/2015  ____05/8/2015___38000
3 ____03/8/2015  ____12/8/2015___59000

所以在这里,我想列出这两条记录,就像这里的第 2 和第 3 -

下一条记录 From_Date 应少于当前记录 TO_DATE

如果我们比较记录 1 和 2 ---- 很好

如果我们比较记录 2 和 3 ----- 5/8/2015 FALSE

--- 所以我想使用 SQL Query 找到这样的记录。

任何建议或任何帮助,请帮助。

已编辑:

我只想将我的记录与我的下一条记录进行比较,而不是与表中的所有记录进行比较。

【问题讨论】:

您使用的是哪种 dbms 产品? (日期/时间通常与 ANSI SQL 兼容...) 实际上,您确实希望将From_Date 存储为等于To_Date。 Dates are a contiguous range type, and should use an exclusive upper-bound。为什么?因为您支付给定的费率直到结束日期到达。它还允许一些有趣的技巧,例如以不会发生这种特殊问题的方式设计您的表格(每一行都会抓取下一个的 From_Date 以用作 To_Date - 但并不总是适用)。 Checking a table for time overlap? 的副本(该答案使用 mysqlTime 类型,但答案应该可以直接使用)。有关为什么有效的更多解释,read this answer。 @Clockwork-Muse - 与表中的每条记录进行比较。我想比较 RecordNo-X 和 RecordNo-X+1 的两个日期,其中 X 将是 0 到 No_of_records 在表中。 ...您如何获得每个RecordNo?你如何使用它?大多数解决方案都有问题,而且一开始就没有必要——在这种情况下,它可能被认为是派生信息,根据开始日期排序。您有多确定只有下一行可能有问题? 【参考方案1】:

如果没有工资_保证没有差距,请尝试自我加入,其中您将 t1 作为“当前记录”,将 t2 作为“下一个记录”:

select t1.*
from Employee_Sal t1
  join Employee_Sal t2
  on t1.wage_No = t2.wage_No - 1
where t2.From_Date < t1.TO_DATE

一种安全的方式,使用相关的子选择来查找下一个工资_No:

select t1.*
from Employee_Sal t1
  join Employee_Sal t2
  on t2.wage_No = (select min(wage_No) from Employee_Sal t3
                   where t3.wage_No > t1.wage_No)
where t2.From_Date < t1.TO_DATE

或者,如果不允许较晚的工资_No 具有过早的 From_Date,则执行 NOT EXISTS

select t1.*
from Employee_Sal t1
where not exists (select 1 from Employee_Sal t2
                  where t2.wage_No > t1.wage_No
                    and t2.From_Date < t1.TO_DATE)

【讨论】:

除非您明确知道某事是保证的连续、无间隙、更新的索引(即,直接来自声明中的ROW_NUMBER()),请不要建议这样的事情。问题是自动生成 ID 不能以这种方式工作......除了在测试中。情况会变得更糟,具体取决于表中是否存在审计历史记录(因此存在匹配的行,但不再相关),或者被从中提取。 是的,我已经意识到我在这里有点太懒了...将添加另一个答案。 ...实际上,这带来了一个不同的问题;我们真的保证它是重叠的 next 记录吗?当然,无论如何,它仍然应该失败其中一项记录...... 我想 OP 仍有一些设计要做......但如果是这样的话,一个简单的 NOT EXISTS 就可以了!我也会补充的。

以上是关于在比较下一条记录的 Date1 和当前记录的 Date2 时查询列出记录的主要内容,如果未能解决你的问题,请参考以下文章

sql查询上一条记录和下一条记录

8.7 确定当前记录和下一条记录之间相差的天数

8.07 确定当前记录和下一条记录之间相差的天数

Oracle查询当前记录的上一条记录或下一条记录

Mysql 查询当前数据上一条和下一条的记录

Crystal Reports,从下一条记录的最小值中减去当前记录的最大值