一对多关系的单SQL选择查询

一对多关系的单SQL选择查询,sql,postgresql,one-to-many,Sql,Postgresql,One To Many,没有例子,这个问题很难解释 我有两张表,公司和员工,他们有一对多的关系,一个公司可以接待多个员工 这里显示了最简单的表结构 Company | id | name | Employee | id | name | company_id | join_date | 现在的问题是: 如何选择前两名员工并在公司表中以列形式显示他们的加入日期 结果是这样的 | id | company_name | first_employee_join_at | second_employee_join_a

没有例子,这个问题很难解释

我有两张表,公司员工,他们有一对多的关系,一个公司可以接待多个员工

这里显示了最简单的表结构

Company
| id | name |

Employee
| id | name | company_id | join_date |
现在的问题是:

如何选择前两名员工并在公司表中以列形式显示他们的加入日期

结果是这样的

| id |  company_name |  first_employee_join_at |  second_employee_join_at |

假设在
employee
表中有一个外键列
company\u id

with emps as (
  select id, name, company_id, 
         row_number() over (partition by company_id order by join_date) as rn
  from employee
)
select c.id, c.name as company_name, 
       e1.join_date as first_employee_join_at, 
       e2.join_date as second_employee_join_at
from company c
  left join emps e1 on e1.company_id = c.id and e1.rn = 1
  left join emps e2 on e2.company_id = c.id and e2.rn = 2;
不过,这并不是非常有效。更高效的版本将使用条件聚合:

with emps as (
  select id, name, company_id, 
         row_number() over (partition by company_id order by join_date) as rn
  from employee
)
select c.id, c.name as company_name, 
       max(e.join_date) filter (where rn = 1) as first_employee_join_at, 
       max(e.join_date) filter (where rn = 2) as second_employee_join_at
from company c
  join emps e on e.company_id = c.id and e.rn in (1,2)
group by c.id, c.name;

假设在
employee
表中有一个外键列
company\u id

with emps as (
  select id, name, company_id, 
         row_number() over (partition by company_id order by join_date) as rn
  from employee
)
select c.id, c.name as company_name, 
       e1.join_date as first_employee_join_at, 
       e2.join_date as second_employee_join_at
from company c
  left join emps e1 on e1.company_id = c.id and e1.rn = 1
  left join emps e2 on e2.company_id = c.id and e2.rn = 2;
不过,这并不是非常有效。更高效的版本将使用条件聚合:

with emps as (
  select id, name, company_id, 
         row_number() over (partition by company_id order by join_date) as rn
  from employee
)
select c.id, c.name as company_name, 
       max(e.join_date) filter (where rn = 1) as first_employee_join_at, 
       max(e.join_date) filter (where rn = 2) as second_employee_join_at
from company c
  join emps e on e.company_id = c.id and e.rn in (1,2)
group by c.id, c.name;

你说的前两名员工是什么意思?“前两名员工”我猜是先加入公司的,对吧?你能提供列定义吗?公司和员工是如何联系的?某处有公司id吗?你说的前两名员工是什么意思?“前两名员工”我想是先加入公司的人吧?你能提供列定义吗?公司和员工是如何联系的?某处是否有
公司id