我正在尝试计算通过注册的任何设备进行交易的唯一用户数。
这是我的查询:
select Distinct
username ,
case
when user_agent like '%Android%' then 'Android'
when user_agent like '%iPhone%' OR user_agent like '%Iphone%' then 'IOS'
else 'Internet Banking'
end as type,
min(time)
from
activeUsers
group by
(1, 2);
但是,在结果集中我得到了这个:
例如,我希望根据最新日期对用户 ujvs24hxen9/abdallah 进行计数,例如仅在网上银行中计数一次,而不在网上银行和 ios 中计数。
我该怎么做?我正在使用 postgresql
谢谢!
最佳答案
使用 PostgreSQL 的 DISTINCT ON (username)
为每个用户仅获取一条记录。使用 ORDER BY
子句首先获取每个用户所需的记录(即最新的记录):
select distinct on (username)
username,
case when user_agent like '%Android%' then 'Android'
when user_agent like '%iPhone%'
or user_agent like '%Iphone%' then 'IOS'
else 'Internet Banking'
end as type,
time
from activeusers
order by username, time desc;
至于您自己的查询:
GROUP BY xyz
表示您希望每个 xyz 一个结果行。在查询中,您按前两列进行分组,因此您可以获得每个用户和类型的结果行。但您只需要每个用户一个结果行。因此,在GROUP BY
子句中输入类型是没有意义的。DISTINCT
从结果中删除重复的行。当您按用户和类型分组并且这两列都被选中时,不能有重复项;这两列已经使每一行都不同,因此在这些行上应用DISTINCT
是多余的。- 您甚至无法尝试查找每个用户的最新时间并使用它来访问所需的记录。显然这个查询不能工作。
关于sql - 根据最近日期sql进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42488581/