很抱歉,如果我的标题没有正确描述我要执行的任务。

对于一个大学项目,我已经收到一个网站的访问日志,我丢弃了不需要的列并将其压缩为:

╔══════════╦══════════════════════╦═════════════════╦═════════════╦════════════════╗
║ accessid ║ date_time_in_seconds ║ yg_requester_id ║ referent_id ║ referent_docid ║
╠══════════╬══════════════════════╬═════════════════╬═════════════╬════════════════╣
║     2449 ║        2009011621830 ║           32276 ║       12648 ║              1 ║
║     2776 ║        2009011622726 ║           76360 ║       11070 ║              1 ║
║     2804 ║        2009011622783 ║           32276 ║       13845 ║              1 ║
║     2894 ║        2009011623025 ║           32276 ║        7222 ║              1 ║
║     2895 ║        2009011623037 ║           32276 ║        1530 ║              1 ║
║     3000 ║        2009011623406 ║           32276 ║        3728 ║              1 ║
║     3019 ║        2009011623497 ║          520060 ║       10356 ║              1 ║
║     3245 ║        2009011625780 ║          300841 ║        4607 ║              1 ║
║     3274 ║        2009011628309 ║          532664 ║       14377 ║              1 ║
║     3275 ║        2009011628420 ║          532664 ║        9097 ║              1 ║
╚══════════╩══════════════════════╩═════════════════╩═════════════╩════════════════╝

最初,时间和日期戳是在每个度量单位(年,月,日,时,分,秒)的单独列中,为了便于计算,我将它们合并为date_time_in_seconds,其格式为
[0000][00][00][00000]
[YEAR][MONTH][DAY][Number of Seconds since 00:00]

accessid是表条目ID,yg_requester_id是网站访问者的唯一ID,referent_id是他们阅读的网站文章的ID,referent_docid表示文章的类型,但是在此任务中不需要。

基本上,我希望能够找到时间差,因为同一yg_requester_id访问了最后一个不同的referent_id。
因此,例如,查看上表中的这一部分行:
╔══════════╦══════════════════════╦═════════════════╦═════════════╦════════════════╗
║ accessid ║ date_time_in_seconds ║ yg_requester_id ║ referent_id ║ referent_docid ║
╠══════════╬══════════════════════╬═════════════════╬═════════════╬════════════════╣
║     2449 ║        2009011621830 ║           32276 ║       12648 ║              1 ║
║     2776 ║        2009011622726 ║           76360 ║       11070 ║              1 ║
║     2804 ║        2009011622783 ║           32276 ║       13845 ║              1 ║
╚══════════╩══════════════════════╩═════════════════╩═════════════╩════════════════╝

yg_requester_id 32276于2009年1月16日在 06:03:50 (午夜后21830秒)访问了ID为 12648 的文章。然后,他们访问了 06:19:43(id为)的ID为 13845 的文章。 2009年1月16日午夜之后的22783秒)。因此可以假设用户阅读了第一篇文章(id 12648 )大约需要15分钟50秒

我想找到的是同一用户访问的文章之间的时差。用户阅读的连续文章可能没有连续的访问ID(尽管它将始终递增)。我还想将读取时间限制在一个小时左右,因为任务是过滤掉读取时间少于可变分钟数(例如15分钟)的记录。

预先感谢,如果需要更多信息,请告诉我

最佳答案

我将使用ROW_NUMBER按yg_requester_id对结果集进行分区,并按accessid或datetime对其进行排序(假设您要按照注释中的建议将date_time_in_seconds列更改为常规datetime列)。
然后,我将请求者将结果集与其自身一起加入到先前的记录中,并得到不同之处。

让我尝试在没有适当数据的情况下编写查询:

SELECT X1.yg_requester_id, DATEDIFF(SECOND, X1.NewDateTimeField, X2.NewDateTimeField) AS TimeDifferenceInSeconds, X1.referent_id AS NewArticle, X2.referent_id AS FormerArticle
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY yg_requester_id ORDER BY NewDateTimeField DESC) AS Position, NewDateTimeField, yg_requester_id, referent_id
FROM YourTable

) X1
INNER JOIN
(
SELECT ROW_NUMBER() OVER(PARTITION BY yg_requester_id ORDER BY NewDateTimeField DESC) AS Position, NewDateTimeField, yg_requester_id, referent_id
FROM YourTable
) X2 ON X2.yg_requester_id = X1.yg_requester_id AND X2.Position = X1.Position - 1

10-06 13:53