首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何只选择多次出现的计数重复数据,而每一行只计数一次?

如何只选择多次出现的计数重复数据,而每一行只计数一次?
EN

Stack Overflow用户
提问于 2020-11-16 03:52:58
回答 1查看 23关注 0票数 1

我想在给定的日期范围内统计返回的访客。每一个出现不止一次的ipAddress都应该作为返回的访问者进行计算。这是如何做到的呢?

表格

代码语言:javascript
复制
ipAddress       | last_update
416.246.227.151 | 2020-11-11 19:29:45
416.246.227.151 | 2020-11-11 20:29:45
173.252.127.119 | 2020-11-11 21:29:45
816.246.227.151 | 2020-11-13 13:53:16
816.246.227.151 | 2020-11-13 15:53:16
816.246.227.151 | 2020-11-13 19:53:16
373.252.127.119 | 2020-11-13 22:53:16
673.252.127.119 | 2020-11-13 20:53:16

查询

代码语言:javascript
复制
SELECT last_update, COUNT(ipAddress) as returningVisitor 
FROM geolocation 
WHERE last_update BETWEEN '2020-11-01' AND '2020-12-01' 
GROUP BY date(last_update)
HAVING (returningVisitor>1) 

结果

代码语言:javascript
复制
last_update         | returningVisitor
2020-11-11 19:29:45 | 3
2020-11-13 19:53:16 | 5

期望结果

代码语言:javascript
复制
last_update         | returningVisitor
2020-11-11 19:29:45 | 1
2020-11-13 19:53:16 | 1

实际上,这两个日期的结果应该是1 returningVisitor。我试过用COUNT(DISTINCT ipAddress),结果还是不太好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-16 03:56:18

我们可以尝试通过两层聚合来处理这个问题。首先,按日期和IP地址进行聚合,以生成每个日期/IP的访问计数,然后限制仅对每个日期进行重复访问。接下来,仅按日期汇总结果,并从所有IP地址中计算重复访问者的数量。

代码语言:javascript
复制
WITH cte AS (
    SELECT DATE(last_update) AS last_update, ipAddress
    FROM geolocation
    WHERE last_update >= '2020-11-01' AND last_update < '2020-12-01' 
    GROUP BY DATE(last_update), ipAddress
    HAVING COUNT(*) > 1
)

SELECT last_update, COUNT(*) AS returningVisitor
FROM cte
GROUP BY last_update;

Demo

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64852499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档