简体   繁体   English

如何从 SQL 中的 2 个表中获取最小值和最大值

[英]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属于该nameID列值最低的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.

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