SQL查询是否可以包含依赖于其他行的逻辑



我试图发现在主键是自动递增且不可重用的行ID的表中无序插入的行。我想知道是否可以在SQL中构建一个基于查询中其他行的查询,即

Select *
From table
Where InsertTime < previous row's InsertTime
Order by RowID

这大致可以满足我的要求,但就我有限的SQL知识而言,这是不可能的,相反,我必须运行查询的剩余部分,并在迭代行时手动进行测试。这是正确的吗?

如果有区别的话,这是在SQLite数据库中。

您可以通过相关子查询从上一行获取值,其中"上一行"表示具有下一个较小rowid的行,其中"下一个更小"实现为"较小的最大rowid":

SELECT *
FROM MyTable
WHERE InsertTime < (SELECT InsertTime
                    FROM MyTable AS T2
                    WHERE T2.rowid < MyTable.rowid
                    ORDER BY rowid DESC
                    LIMIT 1)
ORDER BY rowid

不幸的是,SQLite不支持使这类事情变得容易的CTE或窗口函数。如果你的订单是基于你的RowID的,你可以得到一个带有相关子查询的行号,这样做两次,然后将结果合并在一起,将行号偏移1:

SELECT t1.*
FROM (
      SELECT Rowid, dt, (SELECT COUNT(rowid) 
                         FROM table1 b  
                         WHERE a.rowid >= b.rowid) as RN
      FROM table1 a
      )t1
JOIN  (SELECT Rowid, dt, (SELECT COUNT(rowid) 
                         FROM table1 b  
                         WHERE a.rowid >= b.rowid) as RN
       FROM table1 a
       )t2
 ON t1.RN = t2.RN +1
WHERE t1.dt < t2.dt

演示:SQL Fiddle

最新更新