PostgreSQL:如何提取所有可用的最新分组数据而不进行自连接?

PostgreSQL:如何提取所有可用的最新分组数据而不进行自连接?,postgresql,Postgresql,用户提交表单,因此我有表单表: date user name phone 2016-01-01 1 NULL 1234 2016-02-02 1 NULL 5678 2016-03-03 1 John NULL 2016-04-04 2 Ken NULL 我想按用户分组获取所有可用的最新用户数据: user name phone 1 John 5678 2 Ken NULL 如果用户为同一字段输入了

用户提交表单,因此我有表单表:

date        user  name  phone
2016-01-01  1     NULL  1234
2016-02-02  1     NULL  5678
2016-03-03  1     John  NULL
2016-04-04  2     Ken   NULL
我想按用户分组获取所有可用的最新用户数据:

user  name  phone
1     John  5678
2     Ken   NULL
如果用户为同一字段输入了不同的数据,我希望获得最新的数据

例如–用户1提交了电话1234,然后提交了5678–所以我只需要5678

是否可以使用PostgreSQL单查询而不使用自联接和子查询来获得结果?聚合函数的一些组合


注:这就是问题与类似问题不同的原因:简单的“distinct on”没有帮助,因为它给出最后一个值,即使这些值为空。

尝试以下方法:

select
    usr, name, phone
from (
    select
        usr, name,
        row_number() over (partition by usr order by date desc) rn,
        first_value(phone) over (
            partition by usr
            order by case when phone is null 
                then 1 else 0 end, date desc
        ) phone
    from your_table t
) t where rn = 1;
row_number
按日期顺序分配每个用户的行号,以通过过滤获取最新的行,并使用条件order by
获取最新的非空电话号码。此外,如果需要,可以对名称应用类似的逻辑来获取最新的非空值列。

在首先给出非空值的顺序上使用
first\u value()

with my_table (date, user_id, name, phone) as (
values
    ('2016-01-01',  1,     NULL, '1234'),
    ('2016-02-02',  1,     NULL, '5678'),
    ('2016-03-03',  1,     'John', NULL),
    ('2016-04-04',  2,     'Ken', NULL),
    ('2016-02-05',  3,     NULL, NULL),
    ('2016-03-06',  3,     'Susan', '4444'),
    ('2016-04-07',  3,     'Alice', '5555')
)

select distinct on (user_id)
    user_id, 
    first_value(name) over (partition by user_id order by name is null, date desc) as name,
    first_value(phone) over (partition by user_id order by phone is null, date desc) as phone
from my_table
order by user_id, date desc

 user_id | name  | phone 
---------+-------+-------
       1 | John  | 5678
       2 | Ken   | 
       3 | Alice | 5555
(3 rows)

这正是我需要的!非常感谢你!这比自连接好。非常感谢。这就是问题与类似问题不同的原因:简单的“distinct on”没有帮助,因为它给出了最后一个值,即使它们为空,也没有满足您对最新cols而不是最新行的要求。