【发布时间】:2015-01-25 10:32:08
【问题描述】:
我最近正在调查一个问题,即写入某个 dbs 表的行的百分比在不应为空的列中具有空值。当按时间戳列对该表进行排序时,我注意到具有空值的行不是随机分散的,而是大块的。该列有数千行为空,然后是数千行具有有效值,依此类推。
我想调查在这些波段的边界发生了什么,列从空值切换到非空值,反之亦然。在这些开关周围的时间或数据中找到模式似乎对调试问题非常有用。
我想不出让 sql 只选择这些行的方法,所以我最终编写了一个快速程序来处理数据并返回我想要的内容。请参阅下面的伪代码来演示该算法。
resultSet = db.query("select * from table t order by t.timestamp")
prevRow = null
// for simplicity, let's assume there's always at least 2 rows
currentRow = resultSet.next()
nextRow = resultSet.next()
while(resultSet.hasNext())
// if the null state of column we care about has changed around this current row
if(hasNullColumn(prevRow) != hasNullColumn(nextRow)) printRow(currentRow)
prevRow = currentRow;
currentRow = nextRow;
nextRow = resultSet.next();
但是我真的很好奇是否有一种方法可以编写一个只返回上述逻辑打印的行的 sql 查询?那可能吗?
【问题讨论】:
-
有
LAG和LEAD函数,我相信它们是 SQL 的 ANSI 标准的一部分。 SQL Server 从 SQL Server 2012 开始支持这些功能。但不确定 MySQL(您标记了两者)。 -
这个问题是关于 MySQL 还是 SQL-Server?它们不是一回事,请选择一个标签。
标签: mysql sql-server