如何在单个ROW中显示具有相同ID的不同行中的不同日期?

时间:2019-07-23 04:17:53

标签: mysql

我试图基于一个通用的列值从不同的行中获取日期,并将其显示在单个行中。

我们有下表

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,因此它尚未终止。

2 个答案:

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

---

View on DB Fiddle