updated
I have the following table of updates which you will note contains nulls

refer event_date col1 col2 col3 cat
2 today null null bbb a
2 yesterday null null null b
2 yesterday null xyz null b
2 last week abc3 null null z
2 two weeks ago aab null null z
2 last month null def AAA a
2 last year vwy aa123 null b

因此,对于REFER=2

  • BBB是基于CAT=a(今天)的最新日期的Col3的最新更新.
  • XYZ是基于cat=b的日期(昨天)的col2的最新更新.
  • ABC3是COL1的最新更新,基于CAT z的日期(上周).

我之前问了一个类似的问题here,并接受了@gmb友好提供的以下代码,如果上面的表没有空值,它工作得很好.

select refer,
    max(col1) filter(where rn3 = 1 and cat = 'a') detail,
    max(col1) filter(where rn2 = 1 and cat = 'b') detail2,
    max(col1) filter(where rn1 = 1 and cat = 'z') detail3
from (
    select t.*,
        row_number() over(partition by refer,col3 order by event_date desc) rn1,
        row_number() over(partition by refer,col2 order by event_date desc) rn2,
        row_number() over(partition by refer,col1 order by event_date desc) rn3
    from mytable t
) t
group by refer

预期输出:

refer col1 lastest col2 latest col3 latest
2 bbb xyz abc3

问题是,如果列中有空值,它就不起作用,而且我想不出如何从窗口分区组中消除空值.如果我可以在分区中添加is not null,如下所示,它将解决我的问题,例如:

select
row_number() over(partition by refer, col3 **(where col3 is not null)** order by event_date desc) rn1
,row_number() over(partition by refer, col2, ***(where col2 is not null)*** order by event_date desc) rn2
,row_number() over(partition by refer, col1, ***(where col1 is not null)*** order by event_date desc) rn3

推荐答案

要从所有分区中删除null个值,请在row_number()中使用条件顺序,分区也必须基于refercat:

select refer,
    MAX(col3) filter(where rn3 = 1 and cat = 'a') col1_lastest,
    MAX(col2) filter(where rn2 = 1 and cat = 'b') col2_lastest,
    MAX(col1) filter(where rn1 = 1 and cat = 'z') col3_lastest
from (
    select t.*,
      row_number() over(partition by refer,cat order by case when col3 is not null then 1 else 2 end, event_date desc) rn3,
      row_number() over(partition by refer,cat order by case when col2 is not null then 1 else 2 end, event_date desc) rn2,
      row_number() over(partition by refer,cat order by case when col1 is not null then 1 else 2 end, event_date desc) rn1
    from mytable t
) t
group by refer;

结果:

refer col1_lastest col2_lastest col3_lastest
2 bbb xyz abc3

Demo here

Sql相关问答推荐

Snowflake SQL比较克隆x原始计数

PostgreSQL:如果发现多行具有相似列值,则跳过 Select 行

在Golang中管理数据库事务的简洁方法

在Oracle中,如何删除具有特定值的行,仅当它是重复的行?

从字符串中删除";1、";和";2,";,而不删除";11、";和";12、";

从包含PostgreSQL中的JSON值的列中提取列表或目录

如何找到一个组合的两个列,这是不是在其他表在ORACLE SQL?

如何为该查询编写正确分区依据

将一个数组反嵌套到另外两个数组SQL中(Athena/presto)

更正用于判断错误组合的SQL

在VB.NET中如何在MS Access数据库中创建SQL项目历史库存卡

如何根据几个条件 Select 值:如果满足一个范围的SUM,则对另一个范围求和

通过UPDATE SELECT更新表时出现问题

SQL 查找 varchar 类型列及其值中多次出现的子字符串

将空 JSON 数组添加到 SQL Server 表列中的 JSON 字符串

如何在 SQL Server 中将 -13422.8450 舍入到 -13422.84

在 postgresql 中,我可以将其组合成一个查询吗?

来自 SQL Server 的树层次 struct 图的 JSON

连接表时避免重复

SQL:获取连接表的第一个项目