sql - 根据最近日期sql进行计数

标签 sql postgresql greatest-n-per-group

我正在尝试计算通过注册的任何设备进行交易的唯一用户数。

这是我的查询:

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); 

但是,在结果集中我得到了这个:

Image Showing query results

例如,我希望根据最新日期对用户 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/

相关文章:

mysql - 如何修改现有表设置以自动递增 PK 字段?

postgresql - 如何在 Pl/pgSQL 中使用声明的参数作为查询的组成部分?

json - 在 json 中使用 SELECT 更新 psql 表

mysql - 每个id获取一个

sql - Mysql访问主表里面的右连接子查询

sql - 将两个单独查询的结果合并到两列中

sql - 如何获取sql server中的最新行

mysql - 包含万亿记录的数据库表的查询计划

mysql - 我如何编写这种查询(为每一行返回最新的可用数据)

mysql - 查询从元数据表中提取用户数据