简体   繁体   中英

First date from second table where date is bigger than date in table first oracle

I want pull out the date from second table. My second table may have a over 100 dates to a unique record(A,B,C). I have I first Table:

Name    Count   Data1
A   1   20190201
B   3   20190201
C   6   20190201

and the second table:

Name    Date
A   20190101
B   20190203
A   20190102
B   20190103
C   20190305
C   20190809
A   20190304
B   20190405

I want to first table pull out the date first date from second table when date is bigger than the date1 from first table.

The result must be:

Name    Count   Data1   Date2
A   1   20190201    20190304
B   3   20190201    20190203
C   6   20190201    20190305

How to extract the date. It must be a procedure or another solution. Thanks for help:)

use join and min()

select t1.name,t1.data1,t1.count,min(t2.date) as date2
 from table1 t1 join table2 t2
on t1.name=t2.name
and t1.date<t2.date
group by t1.name,t1.date,t1.count

You want the earliest date from the second table that is also greater than the date in the first table:

There are multiple solutions including a correlated sub-query:

SELECT t1.*,
       ( SELECT MIN( "DATE" )
         FROM   Table2 t2
         WHERE  t1.name  = t2.name
         AND    t1.data1 < t2."DATE" ) AS data2
FROM   table1 t1

or

SELECT name,
       "COUNT",
       data1,
       data2
FROM   (
  SELECT t1.*,
         t2."DATE" AS data2,
         ROW_NUMBER() OVER ( PARTITION BY t1.name ORDER BY t2."DATE" ) AS rn
  FROM   table1 t1
         INNER JOIN table2 t2
         ON ( t1.name = t2.name AND t1.data1 < t2."DATE" )
)
WHERE  rn = 1

You can simply use aggregation:

select t1.name, t1.count, t1.data1, min(t2.date) date2
from table1 t1
inner join table2 t2 on t1.name = t2.name and t2.date > t1.data1
group by t1.name, t1.count, t1.data1

You need analytical function:

SELECT NAME, COUNT_, DATA1, DATE2 FROM
(SELECT T1.NAME, T1.COUNT_, T1.DATA1, 
        ROW_NUMBER() 
        OVER (PARTITION BY T1.NAME ORDER BY T2.DATE) AS RN, 
        T2.DATE AS DATE2
FROM TABLE1 T1 JOIN TABLE2 T2
ON (T1.NAME = T2.NAME))
WHERE T2.DATE > T1.DATA1
WHERE RN = 1

Cheers!!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM