如何复制现有列,但所有值都为“一个单元格向上”,但按不同列进行分区?

时间:2019-04-02 13:23:14

标签: sql

我正在sql中创建一个表,其中包含所有已关​​闭的活动。我的一些专栏是CompanynameActualEndDate。 该表由CompanyName和ActualEndDate desc排序。

我想添加一个列,其中包含每个公司的上次活动的日期。因此,如果我在2018-01-012018-02-012018-02-12上有公司A的三个活动(在ActualEndDate列中),我想在它旁边有一个额外的列,该列是2018-01-新列中的01为空,2018-02-012018-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新手,如果我的解释不好,对不起。

2 个答案:

答案 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列。