我遇到了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
会首先过滤行然后删除重复项,或者首先删除重复项然后过滤行?
如果在删除重复项之前进行过滤,您建议使用其他哪些解决方案?
答案 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'