如何从 SQL 中的 2 个表中获取最小值和最大值
How to get min and max from 2 tables in SQL
我正在尝试从最小 ID (ID=1) 获取 start date
并从最大 ID (ID=3) 获取 end date
,但我不确定如何检索。以下是我的数据 -
表 1 和表 2 是来源 table。我正在尝试获得像 3rd table 这样的输出。
我的要求是从 ID 的第一条记录获取开始日期,从 ID 的最后一条记录获取结束日期,我们可以借助 ID 字段识别第一条和最后一条记录。如果 ID 为 min 表示第一条记录,ID 为 max 则表示最后一条记录
请帮帮我!
这是一种选择;假设您使用 Oracle(关于您使用 Oracle SQL Developer),x
内联视图选择
start_date
属于 name
,具有该 name
的最低 ID
列值(即 first_value 按名称分区按 id) 排序
end_date
属于 name
,该 name
具有最高的 ID
列值(即 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>
我正在尝试从最小 ID (ID=1) 获取 start date
并从最大 ID (ID=3) 获取 end date
,但我不确定如何检索。以下是我的数据 -
表 1 和表 2 是来源 table。我正在尝试获得像 3rd table 这样的输出。
我的要求是从 ID 的第一条记录获取开始日期,从 ID 的最后一条记录获取结束日期,我们可以借助 ID 字段识别第一条和最后一条记录。如果 ID 为 min 表示第一条记录,ID 为 max 则表示最后一条记录
请帮帮我!
这是一种选择;假设您使用 Oracle(关于您使用 Oracle SQL Developer),x
内联视图选择
start_date
属于name
,具有该name
的最低ID
列值(即 first_value 按名称分区按 id) 排序
end_date
属于name
,该name
具有最高的ID
列值(即 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>