sql—如何匹配一个有3列的表,用第三列的第一个非值返回第二列的第一个当前值?

7tofc5zh  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(320)

我正在努力使这项工作成功。我有一张这样结构的table:

enter code here
|---------------------|------------------|------------------|
|      source         |   updated_date   |   closed_date    |
|---------------------|------------------|------------------|
|        RMD          |   2019-01-01     |       NULL       |
|---------------------|------------------|------------------|
|        RMD          |   2019-01-25     |       NULL       |
|---------------------|------------------|------------------|
|        RMD          |   2019-01-29     |    2019-02-05    |
|---------------------|------------------|------------------|
|        SRC          |   2019-02-15     |       NULL       |
|---------------------|------------------|------------------|
|        SRC          |   2019-02-19     |    2019-02-21    |
|---------------------|------------------|------------------|
|        SRC          |   2019-02-20     |       NULL       |
|---------------------|------------------|------------------|
|        SRC          |   2019-02-27     |    2019-02-28    |
|---------------------|------------------|------------------|

我需要返回第一个更新日期和相应的第一个非空关闭日期。
例如,基于上述数据,我想返回以下内容:

|---------------------|------------------|------------------|
|      source         |   updated_date   |   closed_date    |
|---------------------|------------------|------------------|
|        RMD          |   2019-01-01     |    2019-02-05    |
|---------------------|------------------|------------------|
|        SRC          |   2019-02-15     |    2019-02-21    |
|---------------------|------------------|------------------|
|        SRC          |   2019-02-20     |    2019-02-28    |
|---------------------|------------------|------------------|

这对我来说是相当有挑战性的,我正在为得到这份工作而绞尽脑汁。我能得到的最接近的方法是使用self relationship,但我无法做到这一点,因为我无法获得第一个值与第二个值匹配,我也尝试了coalesce,但要么它不适用于这个示例,要么我没有很好地使用它。
有什么好灵魂能给我光明吗?

csbfibhn

csbfibhn1#

可以使用累积窗口函数和聚合:

select source, min(updated_date), max(closed_date)
from (select t.*,
             count(closed_date) over (partition by source order by updated_date desc) as grp
      from t
     ) t
group by source, grp;

这个想法是对 updated_date 将组分配给行。然后基于该组进行聚合。

相关问题