Sql 选择上一行日期作为当前行日期

Sql 选择上一行日期作为当前行日期,sql,Sql,我有一张像下面这样的桌子 我需要它如下 按卡号分组,当投保id不同时,出生日期应为前一行结束日期 提前感谢您可以使用lag()。目前尚不清楚哪些列可用于记录排序,但其想法是: select card_no, insured_no, lag(end_date, 1, birth_date) over(partition by card_no order by insured_no) birth_date, end_date from mytable 理想情况下,您可以使用一列

我有一张像下面这样的桌子 我需要它如下

按卡号分组,当投保id不同时,出生日期应为前一行结束日期 提前感谢

您可以使用
lag()
。目前尚不清楚哪些列可用于记录排序,但其想法是:

select card_no, insured_no, 
    lag(end_date, 1, birth_date) over(partition by card_no order by insured_no) birth_date,
    end_date
from mytable

理想情况下,您可以使用一列(或一组列)来替换
order by
子句中的
insurated\u no
,该列可以唯一地标识每行的位置。

这是一个棘手的问题,因为存在重复项。我将从
lag()
开始:

但是,结果不稳定,如果每行上都有一个唯一的id,结果会更好。

答案如下

select card_no, 
    insured_no, 
    lag(end_date, 1, birth_date) over (partition by card_no order by end_date, birth_date) as birth_date,
    end_date
from table_name

必须在延迟中通过(结束日期,1,出生日期),否则,第一行的出生日期将不正确,因为第一行需要相同的出生日期。

请解释逻辑并提供数据库标签。按卡号分组。当投保id与前一行不同时,出生日期应该是前一行结束日期谢谢,我已经更新了输出表pic。请检查并指导我实现它谢谢,我已经更新了输出表pic。请检查并指导我实现它谢谢,我已经更新了输出表pic。请检查并指导我实现它
select card_no, 
    insured_no, 
    lag(end_date, 1, birth_date) over (partition by card_no order by end_date, birth_date) as birth_date,
    end_date
from table_name