我目前正在使用Firebird数据库,并且正在尝试标识/标记记录
具有零pos_buildcount值并且零记录的前一条记录的pos_buildcount值不是255。我可以在excel中做到这一点,但我想在SQL查询中做到这一点,因为excel只能处理一定数量的记录。本质上,我希望我的结果看起来像下图:
我尝试了以下链接来尝试选择单个记录,但是大多数解决方案使用我的数据库没有的id号(我不知道为什么),或者解决方案使用了Firebird没有的row_number()命令。
Selecting the last record that meets a condition
Is there a way to access the “previous row” value in a SELECT statement?
答案 0 :(得分:0)
使用我的数据库没有的ID号
然后添加它。
SQL是集合语言:https://en.wikipedia.org/wiki/Set_(mathematics)
根据定义,集合中的元素彼此之间,北部或南部或前后都不位于左侧或右侧。他们只是存在。以无序的方式。
因此,如果要对行进行排序-那么必须在其中添加一些排序值(字段,列),然后填充该值。然后从表中读取(如果需要),您可能会要求按该值对结果进行排序。
到目前为止,Firebird拥有按其可能想要的任何顺序读取行的所有权利,甚至可以更改磁盘上行的顺序(它不会,但是这是ndetail的实现,将来可能会更改)。
您必须添加一些ID列,然后进行填充。 这将使“最后记录”或“先前记录”或“行上方”成为有意义的习惯用法:“ ID小于当前对象ID的对象”。到目前为止,在SQL术语中,“最新记录”中没有任何含义,并且不可能可靠地制定查询条件。
在那之后,更改表中的标志列将变成一条简单的MERGE
语句。
MERGE INTO MyTable T1
USING MyTable T2
ON (T2.ID = T1.ID - 1) AND (T2.pos_buildcount <> 255)
WHEN MATCHED THEN
UPDATE SET T1.flag = 1
或者,不将列添加到表中,而是在查询中创建“虚拟”列,从而将表自身连接起来。
https://en.wikipedia.org/wiki/Join_(SQL)#Left_outer_join
SELECT T1.*, T2.Vehicle as Flag
FROM MyTable T1
LEFT JOIN MyTable T2
ON (T2.ID = T1.ID - 1) AND (T2.pos_buildcount <> 255)
保证只有在ID列中填充不带任何整数的整数时,它才有效。否则,除“ T2.ID = T1.ID - 1
”之外,“先前记录”的含义还有其他定义,但该想法成立。定义“先验”是指实列上的实数据,然后可以将表与其自身进行比较。