[英]How to get min and max from 2 tables in SQL
I am Trying to get start date
from min ID (ID=1) and end date
from max ID (ID=3) but i am not sure how i can retrieve.我正在尝试从最小 ID (ID=1) 获取start date
,从最大 ID (ID=3) 获取end date
,但我不确定如何检索。 Following is my data -以下是我的数据 -
Table1 and Table2 are source table.表 1 和表 2 是源表。 I am trying to get output like 3rd table.我试图让 output 像第三张桌子一样。
My requirement is get start date from first record of ID and End Date from last record of ID, we can recognize first and and last record with the help of ID field.我的要求是从 ID 的第一条记录获取开始日期,从 ID 的最后一条记录获取结束日期,我们可以借助 ID 字段识别第一条记录和最后一条记录。 If ID is min means first record and ID is max then last record如果 ID 为 min 表示第一条记录,ID 为 max 则表示最后一条记录
Please help me!请帮我!
Here's one option;这是一种选择; presuming you use Oracle (regarding you use Oracle SQL Developer), the x
inline view selects假设您使用 Oracle(关于您使用 Oracle SQL Developer), x
内联视图选择
start_date
which belongs to name
with the lowest ID
column value for that name
(ie first_value partition by name order by id ) start_date
属于该name
的ID
列值最低的name
(即first_value 按名称顺序按 id 分区)end_date
which belongs to name
with the highest ID
column value for that name
(ie first_value partition by name order by id DESC ) end_date
属于具有该name
的最高ID
列值的name
(即first_value 按名称顺序按 id DESC 分区)SQL> with
2 -- sample data
3 t1 (pid, name) as
4 (select 123, 'xyz' from dual union all
5 select 234, 'pqr' from dual
6 ),
7 t2 (id, name, start_date, end_date) as
8 (select 1, 'xyz', date '2020-01-01', date '2020-07-20' from dual union all
9 select 2, 'xyz', date '2020-02-01', date '2020-05-30' from dual union all
10 select 3, 'xyz', date '2020-06-30', date '2020-07-30' from dual union all
11 --
12 select 1, 'pqr', date '2020-04-30', date '2020-09-30' from dual union all
13 select 2, 'pqr', date '2020-05-30', date '2020-09-30' from dual union all
14 select 3, 'pqr', date '2020-06-30', date '2020-07-01' from dual
15 )
16 select a.pid,
17 x.name,
18 max(x.start_date) start_date,
19 max(x.end_date) end_date
20 from t1 a join
21 (
22 -- start_date: always for the lowest T2.ID value row
23 -- end_date : always for the highest T2.ID value row
24 select b.name,
25 first_value(b.start_date) over (partition by b.name order by b.id ) start_date,
26 first_value(b.end_date) over (partition by b.name order by b.id desc) end_date
27 from t2 b
28 ) x
29 on a.name = x.name
30 group by a.pid,
31 x.name
32 order by a.pid;
PID NAME START_DATE END_DATE
---------- ---- ---------- ----------
123 xyz 01/01/2020 07/30/2020
234 pqr 04/30/2020 07/01/2020
SQL>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.