按DISTINCT ON子句“分组”的行过滤

时间:2014-06-05 20:44:39

标签: postgresql

我遇到了DISTINCT ON子句,我可以用它来连接另一个表的最后一行。例如,以下查询将显示所有用户的上次访问权限:

SELECT DISTINCT ON (user.id)
    user.id, access.login_time, access.geocoded_location

FROM user

JOIN access
    on access.user_id = user.id

ORDER BY user.id ASC, access.id DESC

现在,我希望获得上次访问2014年之前的用户。

SELECT DISTINCT ON (user.id)
    user.id, access.login_time, access.geocoded_location

FROM user

JOIN access
    on access.user_id = user.id

WHERE
    access.login_time < '2014-01-01 00:00:00+00'

ORDER BY user.id ASC, access.id DESC

此查询是否会检索我期望的用户,或者它是否会在2014年之前获得所有用户之前的上次访问权限?

更一般地说,postgres会首先过滤行然后删除重复项,或者首先删除重复项然后过滤行?

如果在删除重复项之前进行过滤,您建议使用其他哪些解决方案?

1 个答案:

答案 0 :(得分:0)

where子句中的条件仅在构建from子句中的派生表之后和select列表之前应用。因此,您需要将条件应用于整个查询的结果

select *
from (
    select distinct on (user.id)
        user.id, access.login_time, access.geocoded_location
    from
        user
        inner join
        access on access.user_id = user.id
    order by user.id asc, access.id desc
) s
where login_time < '2014-01-01 00:00:00+00'