我的算法用于“点击计数器”,如果该人在一段时间内两次来到该网站,我试图不计算同一个人两次(例如,如果他在5分钟内来两次,我想算一下它为这个人打了一场)
这是我的数据库的样子
UserIp UserId Date of user came
127.0.0.1 new.user.akb 26.03.2010 10:15:44
127.0.0.1 new.user.akb 26.03.2010 10:16:44
127.0.0.1 new.user.akb 26.03.2010 10:17:44
127.0.0.1 new.user.akb 26.03.2010 10:18:44
127.0.0.1 new.user.akb 26.03.2010 10:19:44
127.0.0.1 new.user.akb 26.03.2010 10:20:44
127.0.0.1 new.user.akb 26.03.2010 10:21:44
127.0.0.1 new.user.akb 26.03.2010 10:22:44
127.0.0.1 new.user.akb 26.03.2010 10:23:44
我需要做的是从一个时间间隔内发生的上表中获取不同的UserIP数量。例如,如果我将时间间隔设置为5分钟,让我们说它从
开始26.03.2010 10:15:44
然后我会得到2作为结果,因为在10:15到10:20之间有1个不同的值,而在10:20到10:23之间有1个不同的值,
例如,如果我的间隔是3分钟,那么返回结果将是3
答案 0 :(得分:4)
这里有一个几乎相同的问题:Group by Time interval.
它的基础是你需要按时间间隔进行分组,方法是在日期时间内应用一个楼层来平整间隔。
<强> 修改 强>
使用分组解决它:
SET DATEFORMAT dmy;
DECLARE @table TABLE
(
UserIp nvarchar(15),
UserId nvarchar(15),
VisitDate datetime
)
INSERT INTO @table
VALUES ('127.0.0.1', 'new.user.akb', '26.03.2010 10:15:44')
,('127.0.0.1', 'new.user.akb', '26.03.2010 10:16:44')
,('127.0.0.1', 'new.user.akb', '26.03.2010 10:17:44')
,('127.0.0.1', 'new.user.akb', '26.03.2010 10:18:44')
,('127.0.0.1', 'new.user.akb', '26.03.2010 10:19:44')
,('127.0.0.1', 'new.user.akb', '26.03.2010 10:20:44')
,('127.0.0.1', 'new.user.akb', '26.03.2010 10:21:44')
,('127.0.0.1', 'new.user.akb', '26.03.2010 10:22:44')
,('127.0.0.1', 'new.user.akb', '26.03.2010 10:23:44')
SELECT UserIp, UserId, MIN(VisitDate) AS firstVisit
FROM @table
GROUP BY dateadd(mi, (datepart(mi,VisitDate)/5)*5,
dateadd(hh, datediff(hh,0,VisitDate),0)),
UserIp, UserId
这给出了以下结果(我的日期格式为ymd):
UserIp UserId firstVisit
--------------- --------------- -----------------------
127.0.0.1 new.user.akb 2010-03-26 10:15:44.000
127.0.0.1 new.user.akb 2010-03-26 10:20:44.000
(2 row(s) affected)
这意味着您可以按每5分钟的次数访问此结果集。
答案 1 :(得分:3)
20000101是一些开始日期:
select dateadd(mi, -d, '20000101') as d, num from
(select count(*) num, datediff(mi ,date_field, '20000101') / 5 * 5 d
from your_table
group by datediff(mi, date_field, '20000101') / 5 * 5 ) as a
order by d
这是使用Linq的C#解决方案:
var d1 = new Tuple<string, string, DateTime>("127.0.0.1", "new.user.akb", DateTime.Parse("26.03.2010 10:15:44"));
var d2 = new Tuple<string, string, DateTime>("127.0.0.1", "new.user.akb", DateTime.Parse("26.03.2010 10:16:44"));
var d3 = new Tuple<string, string, DateTime>("127.0.0.1", "new.user.akb", DateTime.Parse("26.03.2010 10:17:44"));
var d4 = new Tuple<string, string, DateTime>("127.0.0.1", "new.user.akb", DateTime.Parse("26.03.2010 10:18:44"));
var d5 = new Tuple<string, string, DateTime>("127.0.0.1", "new.user.akb", DateTime.Parse("26.03.2010 10:19:44"));
var d6 = new Tuple<string, string, DateTime>("127.0.0.1", "new.user.akb", DateTime.Parse("26.03.2010 10:20:44"));
var d7 = new Tuple<string, string, DateTime>("127.0.0.1", "new.user.akb", DateTime.Parse("26.03.2010 10:21:44"));
var d8 = new Tuple<string, string, DateTime>("127.0.0.1", "new.user.akb", DateTime.Parse("26.03.2010 10:22:44"));
var d9 = new Tuple<string, string, DateTime>("127.0.0.1", "new.user.akb", DateTime.Parse("26.03.2010 10:23:44"));
var list = new List<Tuple<string, string, DateTime>> {d1, d2, d3, d4, d5, d6, d7, d8, d9};
int interval = 3;
var query = list.GroupBy(data => ((int) (DateTime.Now - data.Item3).TotalMinutes)/interval*interval)
.Select(data => new {IP = data.First().Item1});
foreach (var entry in query)
{
Console.WriteLine(entry.IP);
}