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而不是最新行的要求。