如何解决Postgresql:如何在聚合函数后显示其他列
我有两个表:用户和会话。
用户具有列:用户名,ID
会话具有列:userid,lastactivityat,deleteat
我希望为每个用户提取具有最新“上次活动日期”会话的所有用户,然后过滤早于x天的“上次活动日期”用户。 “上次活动日期”采用纪元格式,这就是为什么我不得不进行一些转换计算的原因。
这是我当前的请求(x = 30)
select u.username,min(extract(epoch from now() - to_timestamp(lastactivityat/1000))/86400::int) as most_recent_inactivity_days
from users as u
join sessions as s on s.userid=u.id
where extract(epoch from now() - to_timestamp(lastactivityat/1000))/86400::int >= 30
group by username
order by username
现在,我希望添加到请求的结果中:每个用户的deleteat列,但我因该请求而失败:
select u.username,min(extract(epoch from now() - to_timestamp(lastactivityat/1000))/86400::int) as most_recent_inactivity_days,s.deleteat
from users as u
join sessions as s on s.userid=u.id
where extract(epoch from now() - to_timestamp(lastactivityat/1000))/86400::int >= 30
group by username
order by username
请您指教吗?
解决方法
DISTINCT ON
是这种情况:
SELECT DISTINCT ON (u.username)
u.username,extract(epoch from now() - to_timestamp(lastactivityat/1000))/86400::int AS most_recent_inactivity_days,s.deleteat
FROM users AS u
JOIN sessions AS s ON s.userid=u.id
WHERE extract(epoch from now() - to_timestamp(lastactivityat/1000))/86400::int >= 30
ORDER BY u.username,extract(epoch from now() - to_timestamp(lastactivityat/1000))/86400::int;
这个很好的查询还显示了为什么最好将时间戳记保存为时间戳而不是整数。这样查询就会简单得多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。