我不知道排序是否最合适,但无论如何我有一个大型数据集,其中包括userA,userB,date,interactionDuration列。换句话说,数据集包含描述哪些用户正在进行交互,交互持续多长时间以及交互日期的行。
目标是将这些交互划分为相关的,不相关的或重要的,不重要的,并遵循以下逻辑:如果交互很长,我们认为它很重要,如果它很短,则是偶然的和“不相关的”。另一方面,如果相同的两个人经常互动(每天或每周)和事件,如果单个互动不会持续很长时间,我们认为它很重要,因为它不是偶然的。
数据存储在MS SQL Server 2008中,我想知道是否有可能通过使用SQL查询以某种方式计算不同人对的交互之间的间隔(以天为单位),或者是否有必要编写自定义例程。
无论如何,我非常感谢听到有关如何执行排序的建议,这些排序通过交互次数,交互持续时间和交互之间的间隔将对分成组 - 是否可以计算两个连续记录之间的时间跨度(按日期排序)然后通过单独使用SQL查询选择通常和/或长时间交互的对的组,或者是否需要编写自定义算法?
这些是示例行:
user_A user_B interaction_duration interaction_date_date
00002781A2ADA816CDB0D138146BD63323CCDAB2 0E3F0A58C6BD5202D1B0D4D4F6A0B05E7A156AC7 532 2010-09-04
00002781A2ADA816CDB0D138146BD63323CCDAB2 47DFCA60C7D2D9B32ACBE650BCBA53F3DA57CB7B 29 2010-09-15
00002781A2ADA816CDB0D138146BD63323CCDAB2 8F4ADF3CC26905AF69F930C546954D87DB536E24 83 2010-09-04
00002781A2ADA816CDB0D138146BD63323CCDAB2 8F4ADF3CC26905AF69F930C546954D87DB536E24 10 2010-09-01
00002D2354C7080C0868CB0E18C46157CA9F0FD4 372BD190F61BAACDFA2512B71B0C62BCD654D5D1 50 2010-09-23
00002D2354C7080C0868CB0E18C46157CA9F0FD4 372BD190F61BAACDFA2512B71B0C62BCD654D5D1 105 2010-09-18
00002D2354C7080C0868CB0E18C46157CA9F0FD4 372BD190F61BAACDFA2512B71B0C62BCD654D5D1 44 2010-09-08
00002D2354C7080C0868CB0E18C46157CA9F0FD4 372BD190F61BAACDFA2512B71B0C62BCD654D5D1 50 2010-09-04
00002D2354C7080C0868CB0E18C46157CA9F0FD4 372BD190F61BAACDFA2512B71B0C62BCD654D5D1 21 2010-09-02
按交互频率(稀有度)对上述记录进行排序的最佳方法是什么?是否可以使用SQL查询对其进行排序?
谢谢!
答案 0 :(得分:1)
如果我理解正确,给出这个数据(前10行):
User1 User2 Stamp Duration (secs)
d g 09/01/2010 20
b g 13/01/2010 37
c k 29/01/2010 15
c k 12/01/2010 39
e h 27/01/2010 33
b i 23/01/2010 46
b g 04/01/2010 44
b k 05/01/2010 12
b k 02/01/2010 9
您想知道哪些用户经常或在特定时间段内长时间互动。 我假设你正在使用MS SQL Server 2005或更高版本。
在3到7天的时间内进行10次以上的对话:
WITH Contact(u1, u2, dt) AS (
SELECT DISTINCT
user1, user2, stamp
FROM
Interactions
)
SELECT
u1, u2, dt as FirstConversation, MAX(stamp) as LastConversation,
COUNT(Duration) AS conversations
FROM
Interactions INNER JOIN Contact
ON user1 = u1 AND User2 = u2 AND Stamp >= dt
GROUP BY
u1, u2, dt
HAVING
COUNT(duration) > 10 AND
DATEDIFF("d", MIN(stamp), MAX(stamp)) BETWEEN 3 and 7
ORDER BY
1, 2, 3
WITH语句为每对用户计算其交互日期,忽略白天的多个交互。这是我们在该日期之后找到符合我们设定条件的对话的基线。这由“Stamp> = dt”表示,这意味着“显示联系后有交互的联系人”。
4天内超过2分钟:
WITH Contact(u1, u2, dt)AS (
SELECT DISTINCT
user1, user2, stamp
FROM
Interactions
)
SELECT
u1, u2, dt as FirstConversation, MAX(stamp) as LastConversation,
SUM(Duration) AS timespent
FROM
Interactions INNER JOIN Contact
ON user1 = u1 AND User2 = u2 AND Stamp >= dt
GROUP BY
u1, u2, dt
HAVING
SUM(Duration) > 120 AND
DATEDIFF("d", MIN(stamp), MAX(stamp)) BETWEEN 0 and 4
ORDER BY
1, 2, 3
HTH?
答案 1 :(得分:0)
我建议在子查询中使用分析函数来确定日期间隔,然后按外部查询中的分析函数结果进行排序。