SQL查询查找乱序记录

时间:2012-09-27 18:56:17

标签: mysql sql select sequence

我有一个带有MySQL数据库的PHP程序,其中包含许多记录。特别相关的两列是事件编号和日期。这些都只是前进。但是,有时用户输入的数据不按顺序;例如:

Incident Date
1        Jan 1 2000
2        Jan 1 2010
3        Jan 1 2002

事件2似乎输入错误的日期,应该是2001年1月1日。

有没有办法查询日期不按顺序的记录?或者我是否必须遍历跟踪上次日期的所有记录才能找到错误?

增加注意:事件不是连续的(它们可能是1,3,6,123等)。日期也不是连续的。这些是同一个表中的列。

4 个答案:

答案 0 :(得分:6)

此命令选择同一表中存在较少事件编号但日期较高的记录的任何记录。

 SELECT * FROM TableName T1 WHERE EXISTS 
   (SELECT * FROM TableName T2 
      WHERE T2.Incident < T1.Incident AND T2.Date > T1.Date)

这个稍微复杂一点的命令只能找到“双向”中无序的记录,这意味着它们在文件的前面有一个较晚的记录,而在文件的后面有一个较早的记录。这避免了在文件中的早期记录中出错将使所有后续记录无序出现的情况。但是,它不会在事件编号最低或最高的两个记录中发现问题。

 SELECT * FROM TableName T1 WHERE EXISTS 
   (SELECT * FROM TableName T2 
      WHERE T2.Incident < T1.Incident AND T2.Date > T1.Date)
 AND EXISTS
   (SELECT * FROM TableName T2 
      WHERE T2.Incident > T1.Incident AND T2.Date < T1.Date)

最后,正如Ruakh在评论中指出的那样,上面的查询为您提供了所有无序记录。虽然从技术上讲,这就是你想要的东西,但却很难找到日期链中的“破损点”。以下查询将仅为您提供链变得混乱的记录,不要求IncidentID单调增加,并允许删除事件。

 SELECT * FROM TableName T1 WHERE 
    Date < (SELECT Date FROM TableName T2 WHERE T2.IncidentID = 
   (SELECT MAX(IncidentID) FROM TableName T3 WHERE T3.IncidentID < T1.IncidentID))
 OR Date > (SELECT Date FROM TableName T2 WHERE T2.IncidentID = 
   (SELECT MAX(IncidentID) FROM TableName T3 WHERE T3.IncidentID > T1.IncidentID))

(未经测试,因为我没有方便的MySQL副本)。

答案 1 :(得分:1)

select * from yourtable t1
     inner join yourtable t2
     on t1.incident=t2.incident-1
     and t1.date>t2.date

答案 2 :(得分:1)

这将选择日期大于下一个记录日期的所有ID。那应该告诉你哪些是乱序的。

SELECT Incident FROM table a 
    WHERE a.Date > (SELECT b.Date FROM table b WHERE b.Incident = (a.Incident + 1))

答案 3 :(得分:0)

如果IncidentID列始终采用常规增量序列:

SELECT c.IncidentID AS cincID, p.IncidentID AS pincID, 
c.Date AS cDate, p.Date AS pDate,
DATEDIFF(c.Date, p.Date)
FROM Incident c, Incident p
WHERE c.IncidentID = (p.IncidentID + 1)
AND datediff(c.Date, p.Date) < 1