所以我正在处理事件数据。
我需要确定“X 发生”的时间,将该数据存储在列中,然后确定“生产中”发生的时间。 现在,我只想要在“X 发生”之后出现的第一个“生产中”我不关心以前的。 注意:在“X 发生”和“生产中”发生之间可能存在多种状态。
我尝试了什么:案例时间、自连接、表格......对我没有任何帮助。
非常感谢任何帮助,非常感谢朋友!
TblEvents
=========
EventID OrderID EventDate Status
1 2 01/02/2011 in-production
2 2 02/02/2011 pending
3 2 03/02/2011 on-hold
4 2 03/02/2011 stuck
5 2 03/02/2011 *X happens*
6 2 04/02/2011 pending
7 2 05/02/2011 *in-production*
Output table:
date of event X | date of "in-production"
03/02/2011 05/02/2011
答案 0 :(得分:0)
试试这个:
SELECT
OuterTblEvents.EventDate AS 'date of event X',
(
SELECT EventDate
FROM TblEvents
WHERE
TblEvents.Status = 'in-production'
AND TblEvents.EventID > OuterTblEvents.EventID
ORDER BY TblEvents.EventID
LIMIT 1
) AS 'date of "in-production"'
FROM TblEvents OuterTblEvents
WHERE OuterTblEvents.Status = 'X happens'
但请注意,如果表很大和/或您经常运行 - 性能可能会受到影响,因为在外部查询中找到的每一行都会调用一次内部查询。
此外,Status, EventID
上的复合索引应该使外部和内部查询的性能更高。外部查询将仅使用索引的 Status
部分,内部查询将同时使用 Status
和 EventID
。请注意,此复合索引中列的顺序很重要。