大数据集的排序算法

时间:2010-10-18 11:19:22

标签: sql algorithm sorting

我不知道排序是否最合适,但无论如何我有一个大型数据集,其中包括userA,userB,date,interactionDuration列。换句话说,数据集包含描述哪些用户正在进行交互,交互持续多长时间以及交互日期的行。

目标是将这些交互划分为相关的,不相关的或重要的,不重要的,并遵循以下逻辑:如果交互很长,我们认为它很重要,如果它很短,则是偶然的和“不相关的”。另一方面,如果相同的两个人经常互动(每天或每周)和事件,如果单个互动不会持续很长时间,我们认为它很重要,因为它不是偶然的。

数据存储在MS SQL Server 2008中,我想知道是否有可能通过使用SQL查询以某种方式计算不同人对的交互之间的间隔(以天为单位),或者是否有必要编写自定义例程。

无论如何,我非常感谢听到有关如何执行排序的建议,这些排序通过交互次数,交互持续时间和交互之间的间隔将对分成组 - 是否可以计算两个连续记录之间的时间跨度(按日期排序)然后通过单独使用SQL查询选择通常和/或长时间交互的对的组,或者是否需要编写自定义算法?

EDIT1

这些是示例行:

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查询对其进行排序?

谢谢!

2 个答案:

答案 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)

我建议在子查询中使用分析函数来确定日期间隔,然后按外部查询中的分析函数结果进行排序。