Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我需要一些关于命中计数器算法的想法(按时间间隔分组)_C#_Sql_Tsql_Sql Server 2000_Hitcounter - Fatal编程技术网

C# 我需要一些关于命中计数器算法的想法(按时间间隔分组)

C# 我需要一些关于命中计数器算法的想法(按时间间隔分组),c#,sql,tsql,sql-server-2000,hitcounter,C#,Sql,Tsql,Sql Server 2000,Hitcounter,我的算法是针对“点击计数器”的,如果同一个人在一个时间间隔内两次访问该站点,我尝试不将其计算为两次(例如,如果他在5分钟内两次访问,我想将其计算为此人的1次点击) 下面是我的数据库的外观 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

我的算法是针对“点击计数器”的,如果同一个人在一个时间间隔内两次访问该站点,我尝试不将其计算为两次(例如,如果他在5分钟内两次访问,我想将其计算为此人的1次点击)

下面是我的数据库的外观

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
我需要做的是从上表中获取在一个时间间隔内发生的不同用户IP的数量。例如,如果我将时间间隔设置为5分钟,假设它从

26.03.2010 10:15:44
然后我将得到2作为结果,因为在10:15到10:20之间有1个不同的值,在10:20到10:23之间有1个不同的值


例如,如果我的间隔是3分钟,返回结果将是3分钟,这里有一个几乎相同的问题:

它的基本原理是,您需要按时间间隔分组,方法是对日期时间应用一个下限,以平展时间间隔

编辑

使用分组解决此问题:

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


这意味着您可以计算此结果集每5分钟的访问次数。

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);
}
vard1=newtuple(“127.0.0.1”、“new.user.akb”、DateTime.Parse(“26.03.2010 10:15:44”);
var d2=新元组(“127.0.0.1”,“new.user.akb”,DateTime.Parse(“26.03.2010 10:16:44”);
var d3=新元组(“127.0.0.1”,“new.user.akb”,DateTime.Parse(“26.03.2010 10:17:44”);
var d4=新元组(“127.0.0.1”,“new.user.akb”,DateTime.Parse(“26.03.2010 10:18:44”);
var d5=新元组(“127.0.0.1”,“new.user.akb”,DateTime.Parse(“26.03.2010 10:19:44”);
var d6=新元组(“127.0.0.1”,“new.user.akb”,DateTime.Parse(“26.03.2010 10:20:44”);
var d7=新元组(“127.0.0.1”,“new.user.akb”,DateTime.Parse(“26.03.2010 10:21:44”);
var d8=新元组(“127.0.0.1”,“new.user.akb”,DateTime.Parse(“26.03.2010 10:22:44”);
var d9=新元组(“127.0.0.1”,“new.user.akb”,DateTime.Parse(“26.03.2010 10:23:44”);
var list=新列表{d1、d2、d3、d4、d5、d6、d7、d8、d9};
整数区间=3;
var query=list.GroupBy(data=>((int)(DateTime.Now-data.Item3.TotalMinutes)/interval*interval)
.Select(data=>new{IP=data.First().Item1});
foreach(查询中的var条目)
{
控制台写入线(entry.IP);
}

您最感兴趣的是sql还是c#解决方案?sql解决方案对我来说更合适。我决定在我的答案中添加c#中的linq解决方案。+1,我喜欢linq版本,而元组类的使用让我笑了:)
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);
}