簡體   English   中英

從另一個表獲取以前的日期

[英]Get the previous dates from another table

我有2張桌子。 1個表格如下所示(值存儲為DD-MM-YYYY)

表A:

CustID | StartDate 
1      | 20-1-2016
2      | 25-1-2016
2      | 17-6-2016

表B:

CustID  |  StartDate  |  EndDate
1       |  1-1-2016   |  15-1-2016
1       |  20-1-2016  |  1-4-2016
2       |  1-1-2015   |  1-6-2015
2       |  5-8-2015   |  31-12-2015
2       |  25-1-2016  |  31-5-2016
2       |  17-6-2016  |  31-12-2016

因此,我想要的是擁有表A中的所有數據。並在表B中找到上一個日期。因此,在表B中,從表A的起始日期之前的每個日期范圍中,我都希望有最高的EndDate。

所以它看起來像這樣:

決賽桌:

CustID | TableA.StartDate |  TableB.EndDate (as Previous_date)
1      | 20-1-2016        |  15-1-2016
2      | 25-1-2016        |  31-12-2015
2      | 17-6-2016        |  31-5-2016

我希望這是足夠的信息以獲取幫助。 如果您需要更多,請告訴我。

我的解決方案是這樣的:
如果您也想從表B中選擇其他列,則它會起作用。

SELECT A.id
      ,A.startdate
      ,B.enddate
   FROM tblA A
  INNER JOIN tblB B
     ON A.id = B.id
    AND B.startdate = (
                   SELECT TOP 1 startdate
                     FROM tblB subB
                    WHERE A.id = subB.ID
                      AND subB.startdate < A.startdate
                    ORDER BY startdate desc         
                      )

如果要重現結果,請參見以下鏈接: http ://rextester.com/SGNX33699

我將使用LAG解析功能執行此操作:

WITH a AS (SELECT 1 custid, to_date('20/01/2016', 'dd/mm/yyyy') startdate FROM dual UNION ALL
           SELECT 2 custid, to_date('25/01/2016', 'dd/mm/yyyy') startdate FROM dual UNION ALL
           SELECT 2 custid, to_date('17/06/2016', 'dd/mm/yyyy') startdate FROM dual),
     b AS (SELECT 1 custid, to_date('01/01/2016', 'dd/mm/yyyy') startdate, to_date('15/01/2016', 'dd/mm/yyyy') enddate FROM dual UNION ALL
           SELECT 1 custid, to_date('20/01/2016', 'dd/mm/yyyy') startdate, to_date('01/04/2016', 'dd/mm/yyyy') enddate FROM dual UNION ALL
           SELECT 2 custid, to_date('01/01/2015', 'dd/mm/yyyy') startdate, to_date('01/06/2016', 'dd/mm/yyyy') enddate FROM dual UNION ALL
           SELECT 2 custid, to_date('05/08/2015', 'dd/mm/yyyy') startdate, to_date('31/12/2015', 'dd/mm/yyyy') enddate FROM dual UNION ALL
           SELECT 2 custid, to_date('25/01/2016', 'dd/mm/yyyy') startdate, to_date('31/05/2016', 'dd/mm/yyyy') enddate FROM dual UNION ALL
           SELECT 2 custid, to_date('17/06/2016', 'dd/mm/yyyy') startdate, to_date('31/12/2016', 'dd/mm/yyyy') enddate FROM dual),
    b2 AS (SELECT custid,
                  startdate,
                  enddate,
                  lag(enddate) OVER (PARTITION BY custid ORDER BY startdate) prev_enddate
           FROM   b)
SELECT a.custid,
       a.startdate,
       b2.prev_enddate
FROM   a
       INNER JOIN b2 ON a.startdate = b2.startdate;

    CUSTID STARTDATE   PREV_ENDDATE
---------- ----------- ------------
         1 20/01/2016  15/01/2016
         2 25/01/2016  31/12/2015
         2 17/06/2016  31/05/2016

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM