根据最近日期计算 sql
Counting based on recent date sql
我正在尝试计算从他们注册到的任何设备进行交易的唯一用户数。
这是我的查询:
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
谢谢!
试试这个:
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 , time
from activeUsers a1
where time = (select max(time) from activeUsers a2 where a1.username = a2.username)
我假设当你说 'latest' 时间时,你的意思是最长没有最短时间。
您可以使用 row_number
window 函数来获取每个用户的最后一笔交易:
SELECT username, type
FROM (SELECT 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
ROW_NUMBER() OVER (PARTITION BY username ORDER BY time DESC) AS rn
FROM activeUsers) t
WHERE rn = 1
@Mureinik 给出的答案的替代方法是使用子查询来识别每个用户的最新时间,然后使用它将原始 table 限制为我们实际想要的记录结果集。
WITH cte AS (
SELECT username, MAX(time) AS max_time
FROM activeUsers
GROUP BY username
)
SELECT t1.username,
CASE WHEN t1.user_agent LIKE '%Android%' THEN 'Android'
WHEN t1.user_agent LIKE '%iPhone%' OR t1.user_agent LIKE '%Iphone%' THEN 'IOS'
ELSE 'Internet Banking'
END AS type
FROM activeUsers t1
INNER JOIN cte t2
ON t1.username = t2.username AND
t1.time = t2.max_time
使用 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
是多余的。
- 而且您甚至没有地方尝试查找每个用户的最新时间并使用它来访问所需的记录。很明显这个查询是行不通的。
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
我正在尝试计算从他们注册到的任何设备进行交易的唯一用户数。
这是我的查询:
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
谢谢!
试试这个:
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 , time
from activeUsers a1
where time = (select max(time) from activeUsers a2 where a1.username = a2.username)
我假设当你说 'latest' 时间时,你的意思是最长没有最短时间。
您可以使用 row_number
window 函数来获取每个用户的最后一笔交易:
SELECT username, type
FROM (SELECT 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
ROW_NUMBER() OVER (PARTITION BY username ORDER BY time DESC) AS rn
FROM activeUsers) t
WHERE rn = 1
@Mureinik 给出的答案的替代方法是使用子查询来识别每个用户的最新时间,然后使用它将原始 table 限制为我们实际想要的记录结果集。
WITH cte AS (
SELECT username, MAX(time) AS max_time
FROM activeUsers
GROUP BY username
)
SELECT t1.username,
CASE WHEN t1.user_agent LIKE '%Android%' THEN 'Android'
WHEN t1.user_agent LIKE '%iPhone%' OR t1.user_agent LIKE '%Iphone%' THEN 'IOS'
ELSE 'Internet Banking'
END AS type
FROM activeUsers t1
INNER JOIN cte t2
ON t1.username = t2.username AND
t1.time = t2.max_time
使用 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
是多余的。- 而且您甚至没有地方尝试查找每个用户的最新时间并使用它来访问所需的记录。很明显这个查询是行不通的。
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