gpt4 book ai didi

SQL:查找列值匹配的行之间的差异

转载 作者:行者123 更新时间:2023-12-02 02:11:14 26 4
gpt4 key购买 nike

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

对于一个大学项目,我收到了一个网站的访问日志,我丢弃了不需要的列并浓缩成这样:

╔══════════╦══════════════════════╦═════════════════╦═════════════╦════════════════╗
║ 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表示文章的类型,但是在这个任务中不需要。

基本上,我希望能够找到自从上次不同的 referent_id 被同一个 yg_requester_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 在 06:03:50(午夜后 21830 秒)访问了 ID 为 12648 的文章) 于 2009 年 1 月 16 日。然后他们在 06:19:43 访问了 ID 为 13845 的文章(22783 seconds after midnight) on the 16th January 2009. 因此可以安全地假设用户阅读第一篇文章 (id 12648) 大约 15 分 50 秒

我想找到的是同一用户访问的文章之间的时间差。用户阅读的连续文章可能没有连续的 accessid(尽管它总是递增)。我还想将读取时间限制在一个小时左右,因为任务是过滤掉读取时间<可变分钟数(例如 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

关于SQL:查找列值匹配的行之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12688205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com