我正在用sql制作一个表格,其中包含所有已关闭的活动。我的一些专栏是Companyname
和ActualEndDate
的。该表按"公司名称"和"实际结束日期"按顺序排序。
我想添加一个列,其中包含每个公司的上次活动的日期。因此,如果我在 2018-01-01
、2018-02-01
和 2018-02-12
(在 ActualEndDate 列中(为 A 公司有三个活动,我需要在它旁边增加一列,其中 2018-01-01 的行在新列中为 null,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的新手,所以如果我的解释不好,我很抱歉。
LAG()
是正确的答案。 这是一个 SQL 标准函数,在大多数数据库中都可用。
但是,典型的语法是:
SELECT Companyname, ActualEndDate,
LAG(ActualEndDate) OVER (PARTITION BY Companyname ORDER BY ActualEndDate) as PreviousDate
FROM yourTable;
没有理由在ORDER BY
中重复PARTITION BY
列。
最简单的解决方案是使用窗口函数 - 在您的情况下LAG()
如果您使用的是 SQL-Server,解决方案将是:
SELECT Companyname
,ActualEndDate
,LAG(ActualEndDate) OVER(PARTITION BY Companyname ORDER BY Companyname, ActualEndDate )
FROM yourTable
甲骨文链接:甲骨文中的 LAG
SQL服务器链接:SQL-Server 中的 LAG
MySQL 链接:mySQL 中的 LAG
PostgreSQL的链接:Postgres中的窗口函数