【问题标题】:Case to check if previous record matches last record检查上一条记录是否与上一条记录匹配的案例
【发布时间】:2014-02-02 22:00:22
【问题描述】:

我有如下查询结果。我希望在查询结果中添加一列,如果与同一 [Machine] 相关的最后一条记录的 [FinishTime] 与当前记录具有相同的 [StartTime],则该列将标记为 1。

例如,在下表中,第 5 行 ([Machine]=RD103) 的标志 = 1,因为它的开始时间与其最后一条记录条目(第 3 行)的开始时间相同。

+---+-------+---------+-------+---------+----------------------+
|OID|Machine|StartTime|EndTime|DelayName|Consecutive Delay Flag|
+---+-------+---------+-------+---------+----------------------+
|1  |RD101  |20:00    |20:20  |A        |0                     |
+---+-------+---------+-------+---------+----------------------+
|2  |RD102  |21:00    |22:00  |A        |0                     |
+---+-------+---------+-------+---------+----------------------+
|3  |RD103  |23:00    |23:20  |B        |0                     |
+---+-------+---------+-------+---------+----------------------+
|4  |RD101  |20:20    |20:45  |C        |1                     |
+---+-------+---------+-------+---------+----------------------+
|5  |RD103  |23:20    |23:25  |A        |1                     |
+---+-------+---------+-------+---------+----------------------+

【问题讨论】:

  • 表格格式没有出现在那儿。如果我能获得足够的声誉状态,我会尝试上传图片
  • 不需要,我通过编辑修复了格式。

标签: sql oracle case


【解决方案1】:

这是分析函数作用的一个很好的例子——它们不会强迫你对结果进行分组(换句话说——它们仍然每行产生一个结果),但你可以拥有与其他行相关的值。

在您的情况下,LAG 函数应该可以解决问题:

SELECT oid, machine, starttime, endtime, delayname, 
       CASE WHEN starttime = 
                 LAG (starttime) OVER (PARTITION BY machine ORDER BY starttime) 
            THEN 1 
            ELSE 0 
       END AS flag
FROM   my_table

【讨论】:

  • 哇,感谢您这么快的回复。我会在上午试试这个,让你知道我的进展如何!
  • 好吧,终于要测试它了……这很好用。我必须做一个小改动:Lag(endtime)。真的非常感谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多