首页 > 解决方案 > Postgresql 查询基于 2 列过滤最新数据

问题描述

表结构优先

users table

ID
1
2
3

sites table

ID
1
2

site_memberships table

site_id 用户身份 创建于
1 1 1
1 1 2
1 1 3
2 1 1
2 1 2
1 2 2
1 2 3

假设 created_on 数字越高,最新的记录

Expected Output

site_id 用户身份 创建于
1 1 3
2 1 2
1 2 3

预期输出:我需要每个站点成员的每个用户的最新记录。

尝试了以下查询,但这似乎不起作用。

select * from users inner join
      (
        SELECT ROW_NUMBER () OVER (
            PARTITION BY sm.user_id,
            sm.created_on
        ), sm.* 
            from site_memberships sm 
            inner join sites s on sm.site_id=s.id
            ) site_memberships
ON site_memberships.user_id  = users.user_id where row_number=1```

标签: sqlpostgresql

解决方案


我认为您将要解决的问题过于复杂化了。

你似乎想要聚合:

select site_id, user_id, max(created_on)
from site_memberships sm
group by site_id, user_id;

如果您有其他想要的列,则可以distinct on改用:

select distinct on (site_id, user_id) sm.*
from site_memberships sm
order by site_id, user_id, created_on desc;

推荐阅读