2

私のアルゴリズムは「ヒットカウンター」用です。同じ人が時間間隔で2回サイトに来た場合、同じ人を2回カウントしないようにしています(たとえば、5分間に2回来た場合、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

私がする必要があるのは、時間間隔内に発生した上記の表から個別の UserIP の数を取得することです。たとえば、時間間隔を 5 分間に設定し、開始時刻を

26.03.2010 10:15:44

次に、10:15 から 10:20 までの間に 1 つの個別の値があり、10:20 から 10:23 までの間に 1 つの個別の値があるため、結果として 2 を取得します。

たとえば、間隔が 3 分の場合、返される結果は 3 になります

4

2 に答える 2

4

ここにほぼ同じ質問があります:時間間隔でグループ化します。

その基本は、間隔を平坦化するために日時にフロアを適用することにより、時間間隔でグループ化する必要があるということです。

編集

グループ化を使用して解決しました:

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分あたりの訪問数でカウントできます。

于 2010-03-26T08:55:34.767 に答える
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);
}
于 2010-03-26T09:08:00.857 に答える