在比较下一条记录的 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? 的副本(该答案使用 mysql 和 Time
类型,但答案应该可以直接使用)。有关为什么有效的更多解释,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 时查询列出记录的主要内容,如果未能解决你的问题,请参考以下文章