以下是我的样例输入表:

employee_id project effective_date**
1 A 2014-08-13
1 B 2016-12-21
1 C 2018-02-21
employee_id designation effective_date
1 trainee 2014-08-05
1 senior 2016-08-17
1 team leader 2018-02-05

表1:描述一名员工在组织中的不同日期承担不同项目的情况.

表2:描述表1中同一员工在同一组织中经历不同称号的情况.

现在我想要一个如下所示的预期输出表:

employee_id project designation effective_date
1 A trainee 2014-08-13
1 A senior 2016-08-17
1 B Senior 2016-12-21
1 B team leader 2018-02-05
1 C team leader 2018-02-21

事实是,无论何时:

  • 他的项目更改,我需要显示项目生效日期.
  • 他的名称更改,我需要显示名称生效日期,但要显示他在此名称更改期间参与的项目

推荐答案

这个问题属于缺口和岛屿分类学.这个特定的变种可以分三步解决:

  • 应用这两个表中的UNION ALL个,同时在同一模式内的两个单独的字段中拆分"tab1.project"和"tab2.role"
  • 使用两个运行和(一个用于"designation",另一个用于"project")计算非空值和后续空值之间的分区.
  • 对两个不同的字段应用两个不同的聚合,以删除空值.
WITH cte AS (
    SELECT employee_id, effective_date,
           project        AS project, 
           NULL           AS role         FROM tab1
    UNION ALL 
    SELECT employee_id, effective_date, 
           NULL           AS project, 
           designation    AS role         FROM tab2
), cte2 AS (
    SELECT *,
           COUNT(CASE WHEN project IS NOT NULL THEN 1 END) OVER(
               PARTITION BY employee_id 
               ORDER     BY effective_date
           ) AS project_partition,
           COUNT(CASE WHEN role IS NOT NULL THEN 1 END) OVER(
               PARTITION BY employee_id 
               ORDER     BY effective_date
           ) AS role_partition
    FROM cte    
)
SELECT employee_id, effective_date,
       MAX(project) OVER(PARTITION BY project_partition) AS project,
       MAX(role)    OVER(PARTITION BY role_partition)    AS role
FROM cte2
ORDER BY employee_id, effective_date

查看演示here.

Sql相关问答推荐

更新在两个或多个面中具有交点的面

在请求结束之前,PostgreSQL不会考虑使用中的删除

为什么在这种情况下我不能使用LAG函数?

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

对表进行多项 Select 以返回最大值和时间

动态组/转置

以一致的价值获得独特的价值

TSQL如何为群分配号码

SQL JSON_QUERY 使用列中的值构造 json 路径并接收错误

存储过程太慢

聚合内部的条件在哪里?

删除对 JSON 数据的未解析引用的 SQL71502 警告

如何向 mariadb 添加外键?

Postgres,使用 select 插入多个值

SQL - 只需要 GROUP BY SELECT 的一列

将有效数字作为 varchar 返回的 SQL 函数

在 postgresql 中保存带有时间戳的几何类型数据

字符串从更改到表列和查询中的一行的转换错误

存储过程 - 动态 SQL 中不同列值的计数

在 SQL 的每行选项中 Select 最大值