Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Sql 如何复制现有列但包含所有值';向上一个单元格';,但是被另一列分割了?_Sql - Fatal编程技术网

Sql 如何复制现有列但包含所有值';向上一个单元格';,但是被另一列分割了?

Sql 如何复制现有列但包含所有值';向上一个单元格';,但是被另一列分割了?,sql,Sql,我正在用sql创建一个表,其中包含所有已关闭的活动。我的一些专栏是Companyname和ActualEndDate。 该表按CompanyName和ActualEndDate desc排序 我想添加一个列,其中包含每个公司最后一次活动的日期。因此,如果我在2018-01-01、2018-02-01和2018-02-12(在ActualEndDate列中)为A公司安排了三项活动,我想在其旁边增加一列,其中新列中2018-01-01的行为空,2018-02-01为2018-01-01,而2018-

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

我想添加一个列,其中包含每个公司最后一次活动的日期。因此,如果我在
2018-01-01
2018-02-01
2018-02-12
(在ActualEndDate列中)为A公司安排了三项活动,我想在其旁边增加一列,其中新列中2018-01-01的行为空,
2018-02-01
2018-01-01
,而
2018-02-12
为2018-02-01

我不知道如何做到这一点,因为我不能简单地复制列并将所有值向上移动一个,因为它必须按照companyname进行

有人知道怎么做吗

我想要的是:

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新手,如果我的解释不好,我很抱歉。

最简单的解决方案是使用窗口函数-在您的例子中是
LAG()

如果您使用的是SQL Server,解决方案将是:

SELECT Companyname
      ,ActualEndDate
      ,LAG(ActualEndDate) OVER(PARTITION BY Companyname ORDER BY Companyname, ActualEndDate )
  FROM yourTable
Oracle的链接:

SQL Server的链接:

MySQL的链接:


PostgreSQL的链接:

最简单的解决方案是使用窗口函数-在您的例子中是
LAG()

如果您使用的是SQL Server,解决方案将是:

SELECT Companyname
      ,ActualEndDate
      ,LAG(ActualEndDate) OVER(PARTITION BY Companyname ORDER BY Companyname, ActualEndDate )
  FROM yourTable
Oracle的链接:

SQL Server的链接:

MySQL的链接:

PostgreSQL的链接:

LAG()
是正确答案。这是一个SQL标准函数,在大多数数据库中都可用

但是,典型的语法是:

SELECT Companyname, ActualEndDate,
       LAG(ActualEndDate) OVER (PARTITION BY Companyname ORDER BY ActualEndDate) as PreviousDate
FROM yourTable;
没有理由重复
顺序中的
划分列

LAG()
是正确的答案。这是一个SQL标准函数,在大多数数据库中都可用

但是,典型的语法是:

SELECT Companyname, ActualEndDate,
       LAG(ActualEndDate) OVER (PARTITION BY Companyname ORDER BY ActualEndDate) as PreviousDate
FROM yourTable;

没有理由重复您使用的是哪些RDBMS中的排序依据列中的划分依据?SQL Server、Oracle等?您正在使用哪些关系数据库管理系统?SQL Server、Oracle……?非常感谢!不知道滞后函数。现在就知道了,谢谢:)@user11299833如果你觉得我的答案对你有帮助,你可以。非常感谢!不知道滞后函数。现在就知道了,谢谢:)@user11299833如果你觉得我的答案对你有帮助,你可以。