sqlite根据其他列中以前的值更新列
我有一个包含名称、日期和上一个日期列的表。我需要一个函数,将使前一行的日期等于前一行的日期,如果名称是相同的 我所说的“上一个”,是指所列日期之前的最新时间,因此,如果我有3月5日、3月29日、3月17日和3月10日,那么3月5日将没有以前的日期,3月10日将有3月5日,3月17日将有3月10日,3月29日将有3月17日 因此,如果名字是John,日期为2020年1月1日,而之前的日期将为空,因为之前没有输入。如果第二个名字是John than,无论日期如何,它的前一个日期是2020年1月1日。如果第三个名字不是John,则前一个日期将再次为空,因为名字不匹配 感谢您的帮助sqlite根据其他列中以前的值更新列,sqlite,Sqlite,我有一个包含名称、日期和上一个日期列的表。我需要一个函数,将使前一行的日期等于前一行的日期,如果名称是相同的 我所说的“上一个”,是指所列日期之前的最新时间,因此,如果我有3月5日、3月29日、3月17日和3月10日,那么3月5日将没有以前的日期,3月10日将有3月5日,3月17日将有3月10日,3月29日将有3月17日 因此,如果名字是John,日期为2020年1月1日,而之前的日期将为空,因为之前没有输入。如果第二个名字是John than,无论日期如何,它的前一个日期是2020年1月1日。
为澄清而编辑您可以使用
LAG()
窗口功能进行编辑
如果需要返回上一个日期的查询:
SELECT Names, Date,
CASE WHEN Names = LAG(Names) OVER (ORDER BY Date) THEN LAG(Date) OVER (ORDER BY Date) END PreviousDate
FROM tablename
如果要更新表,请执行以下操作:
WITH cte AS (
SELECT Names, Date,
CASE WHEN Names = LAG(Names) OVER (ORDER BY Date) THEN LAG(Date) OVER (ORDER BY Date) END Previous_Date
FROM tablename
)
UPDATE tablename AS t
SET Previous_Date = (SELECT c.Previous_Date FROM cte c WHERE (c.Names, c.Date) = (t.Names, t.Date))
请参阅简化版。如果您的SQLite版本为3.33.0+,则可以使用
UPDATE…FROM
语法:
WITH cte AS (
SELECT Names, Date,
CASE WHEN Names = LAG(Names) OVER (ORDER BY Date) THEN LAG(Date) OVER (ORDER BY Date) END Previous_Date
FROM tablename
)
UPDATE tablename AS t
SET Previous_Date = c.Previous_Date
FROM cte AS c
WHERE (c.Names, c.Date) = (t.Names, t.Date)
问题是,你说的上一个是什么意思?与Excel电子表格不同,记录没有自然顺序或行号。除非您基于某些列定义订单,否则它们是不相关的。根据哪些列确定哪些记录保存以前的值?编辑OP以澄清