Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sqlite根据其他列中以前的值更新列_Sqlite - Fatal编程技术网

sqlite根据其他列中以前的值更新列

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日。

我有一个包含名称、日期和上一个日期列的表。我需要一个函数,将使前一行的日期等于前一行的日期,如果名称是相同的

我所说的“上一个”,是指所列日期之前的最新时间,因此,如果我有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,则前一个日期将再次为空,因为名字不匹配

感谢您的帮助


为澄清而编辑

您可以使用
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以澄清