2017-07-12 9 views
2

私は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の開始日前のすべてのdaterangeのうち、最高の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 

を私は、これはいくつかの助けを得るために十分な情報量であると思います。もっと必要な場合はお知らせください。

+0

がどのように日付値を格納している

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 ) 

あなたが結果を再現したい場合は、ここでrextesterリンクですか? 'DD-MM-YYYY'または' MM-DD-YYYY'形式ですか?または単に文字型として格納していますか?終了日に「1-15-2016」と「31-12-2015」という値が1つあるため、混乱しています。 –

+0

値はDD-MM-YYYYとして保存されます。混乱して申し訳ありません – Jeuf

+0

EndDateで '1-15-2016'をどうやって使うことができますか? MM(月)の値は「12」より大きくはできません。もう一度データを確認してください。 –

答えて

0

私の解決策は次のようになります。
テーブルBの他の列も選択したい場合は、それが機能します。 http://rextester.com/SGNX33699

+0

ありがとう、これは解決策でした。 – Jeuf

0

が、私はこれを行うだろう 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 
関連する問題