我试图基于一个通用的列值从不同的行中获取日期,并将其显示在单个行中。
我们有下表
Contract ID Created_Date
-----------------------------
1 1/2/2014
1 2/3/2014
1 3/3/2014
2 4/3/2014
2 5/3/2014
2 6/3/2014
2 7/3/2014
3 8/3/2014
3 9/3/2014
4 10/3/2014
4 11/3/2014
5 12/3/2014
----------------------------
Created_Date
显示合同的起始时间以及我们针对同一合同contract_id
的新日期,这意味着先前的合同已终止并且新的合同已开始。我想展示contract
的开始和结束时间。
以下是预期的结果
Contract ID Created_Date Terminated_Date
----------------------------------------------------------------
1 1/2/2014 2/3/2014
1 2/3/2014 3/3/2014
1 3/3/2014 NULL
2 4/3/2014 5/3/2014
2 5/3/2014 6/3/2014
2 6/3/2014 7/3/2014
2 7/3/2014 NULL
3 8/3/2014 9/3/2014
3 9/3/2014 NULL
4 10/3/2014 11/3/2014
4 11/3/2014 NULL
5 12/3/2014 NULL
-----------------------------------------------------------
NULL values
之所以存在,是因为该特定合同没有更多的created_dates
,因此它尚未终止。
答案 0 :(得分:0)
这是一个主意
select
a.ContractID,
a.Created_Date,
b.Terminated_Date
from
(
select
ContractID,
Created_Date,
ROW_NUMBER() OVER (
ORDER BY
Created_Date ASC
) as rownum
from
Table1
) a
Left Join (
select
ContractID,
Created_Date as Terminated_Date,
ROW_NUMBER() OVER (
ORDER BY
Created_Date ASC
) as rownum
from
Table1
) b on b.ContractID= a.ContractID
and b.rownum = a.rownum + 1
答案 1 :(得分:0)
模式(MySQL v5.7)
CREATE TABLE my_table
(Contract_ID INT NOT NULL
,Created_Date DATE PRIMARY KEY
);
INSERT INTO my_table VALUES
(1,STR_TO_DATE('1/2/2014','%d/%m/%Y')),
(1,STR_TO_DATE('2/3/2014','%d/%m/%Y')),
(1,STR_TO_DATE('3/3/2014','%d/%m/%Y')),
(2,STR_TO_DATE('4/3/2014','%d/%m/%Y')),
(2,STR_TO_DATE('5/3/2014','%d/%m/%Y')),
(2,STR_TO_DATE('6/3/2014','%d/%m/%Y')),
(2,STR_TO_DATE('7/3/2014','%d/%m/%Y')),
(3,STR_TO_DATE('8/3/2014','%d/%m/%Y')),
(3,STR_TO_DATE('9/3/2014','%d/%m/%Y')),
(4,STR_TO_DATE('10/3/2014','%d/%m/%Y')),
(4,STR_TO_DATE('11/3/2014','%d/%m/%Y')),
(5,STR_TO_DATE('12/3/2014','%d/%m/%Y'));
查询#1
SELECT a.*
, MIN(b.created_date) next
FROM my_table a
LEFT
JOIN my_table b
ON b.contract_id = a.contract_id
AND b.created_date > a.created_date
GROUP
BY a.contract_id
, a.created_date;
| Contract_ID | Created_Date | next |
| ----------- | ------------ | ---------- |
| 1 | 2014-02-01 | 2014-03-02 |
| 1 | 2014-03-02 | 2014-03-03 |
| 1 | 2014-03-03 | |
| 2 | 2014-03-04 | 2014-03-05 |
| 2 | 2014-03-05 | 2014-03-06 |
| 2 | 2014-03-06 | 2014-03-07 |
| 2 | 2014-03-07 | |
| 3 | 2014-03-08 | 2014-03-09 |
| 3 | 2014-03-09 | |
| 4 | 2014-03-10 | 2014-03-11 |
| 4 | 2014-03-11 | |
| 5 | 2014-03-12 | |
---