我正在sql中创建一个表,其中包含所有已关闭的活动。我的一些专栏是Companyname
和ActualEndDate
。
该表由CompanyName和ActualEndDate desc排序。
我想添加一个列,其中包含每个公司的上次活动的日期。因此,如果我在2018-01-01
,2018-02-01
和2018-02-12
上有公司A的三个活动(在ActualEndDate列中),我想在它旁边有一个额外的列,该列是2018-01-新列中的01为空,2018-02-01
为2018-01-01
,而2018-02-12
为2018-02-01。
我不知道如何完成此操作,因为我不能简单地复制列并向上移动所有值,因为必须按公司名称完成。
有人对如何完成这项工作有任何线索吗?
我想要什么:
Companyname ActualEndDate PreviousDate
A 2018-01-01 null
A 2018-02-01 2018-01-01
A 2018-02-07 2018-02-01
B 2018-01-01 null
B 2018-02-01 2018-01-01
我所拥有的:
Companyname ActualEndDate
A 2018-01-01
A 2018-02-01
A 2018-02-07
B 2018-01-01
B 2018-02-01
我是SQL新手,如果我的解释不好,对不起。
答案 0 :(得分:0)
最简单的解决方案是使用窗口功能-就您而言,LAG()
如果您使用的是SQL Server,解决方案将是:
SELECT Companyname
,ActualEndDate
,LAG(ActualEndDate) OVER(PARTITION BY Companyname ORDER BY Companyname, ActualEndDate )
FROM yourTable
Oracle链接:LAG in Oracle
SQL Server的链接:LAG in SQL-Server
MySQL链接:LAG in mySQL
PostgreSQL链接:Window functions in Postgres
答案 1 :(得分:0)
LAG()
是正确的答案。这是SQL标准功能,在大多数数据库中都可用。
但是,典型的语法是:
SELECT Companyname, ActualEndDate,
LAG(ActualEndDate) OVER (PARTITION BY Companyname ORDER BY ActualEndDate) as PreviousDate
FROM yourTable;
没有理由重复PARTITION BY
中的ORDER BY
列。