【问题标题】:Msql: Counting growth over timeSql:计算随时间的增长
【发布时间】:2011-03-15 20:53:20
【问题描述】:

几周前我发布了这个问题,但我认为我没有清楚地提出这个问题,因为我得到的答案不是我想要的。我认为最好重新开始。

我正在尝试查询数据库以检索一段时间内唯一条目的数量。数据看起来像这样:

Day | UserID
1 |一个
1 |乙
2 |乙
3 |一个
4 |乙
4 | C
5 | D

我希望查询结果看起来像这样

时间跨度 |计数(DISTINCT UserID)
第 1 天至第 1 天 | 2
第 1 天至第 2 天 | 2
第 1 天至第 3 天 | 2
第 1 天至第 4 天 | 3
第 1 天至第 5 天 | 4

如果我做类似的事情

SELECT COUNT(DISTINCT `UserID`) FROM `table` GROUP BY `Day`

,不同的计数将不考虑前几天的用户 ID。

有什么想法吗?我使用的数据集比较大,所以多查询和后处理需要很长时间(我目前就是这样处理的)。

谢谢

【问题讨论】:

  • 您对一天内“唯一身份访问者”的数量感兴趣吗?

标签: mysql group-by distinct


【解决方案1】:

您可以使用子查询

样本表

create table visits (day int, userid char(1));
insert visits values
(1,'a'),
(1,'b'),
(2,'b'),
(3,'a'),
(4,'b'),
(4,'c'),
(5,'d');

查询

select d.day, (select count(distinct userid) from visits where day<=d.day)
from (select distinct day from visits) d

【讨论】:

  • 谢谢!很好的解决方案。我做了1个修改。我不确定它是否更快。在主FROM之后的查询中,我使用了GROUP BY day而不是DISTINCT day
【解决方案2】:

这样的事情怎么样:

SELECT Count(UserID), Day 
FROM     
    (SELECT Count(UserID) as Logons, UserID, Day 
    FROM yourDailyLog
    GROUP BY Day, UserID)
GROUP BY Day

内部选择应该消除同一用户在给定日期的重复访问。

远离 DISTINCT。对于几乎所有 SQL 问题,它通常都是一种值得商榷的方法。

等等:我现在看到您希望时间段随着时间的推移而增加。这让事情变得有点棘手。为什么不将其余信息汇总到代码中,而不是全部通过 sql 完成?

【讨论】:

    猜你喜欢
    • 2021-08-08
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多