Tsql 我想用T-SQL查询为我的事件列表计算会话id

Tsql 我想用T-SQL查询为我的事件列表计算会话id,tsql,row-number,rownum,Tsql,Row Number,Rownum,以下是事件列表 我想计算我的事件列表中的session\u id列 之后,我尝试计算每个会话中事件之间的时间。 每个会话\u id应从事件\u name=“app\u open”开始,按时间戳排序。在下表中,您可以看到我拥有的数据(前3列)和我想要计算的最后一列 我如何使用T-SQL实现它 event\u namevent\u numbertimestampsession\u idapp\u open12015-09-10 02:54:041crashlytics\u init22015-09

以下是事件列表
我想计算我的事件列表中的
session\u id

之后,我尝试计算每个会话中事件之间的时间。 每个
会话\u id
应从
事件\u name=“app\u open”
开始,按
时间戳排序。在下表中,您可以看到我拥有的数据(前3列)和我想要计算的最后一列

我如何使用T-SQL实现它


event\u namevent\u numbertimestampsession\u idapp\u open12015-09-10 02:54:041crashlytics\u init22015-09-10 02:54:381 parse\u init32015-09-10 02:55:131appsflyer\u init42015-09-10 02:56:101googleanalytics\u init52015-09-10-10 02:56:541login\u popup62015-09-10 02:57:251登录\u get72015-09-10-03:01:271登录成功03:02:441app\u open12015-09-10 03:04:212crashlytics\u init22015-09-10 03:06:072 parse\u init32015-09-10 03:07:272login\u get42015-09-10 03:07:272login\u成功52015-09-10 03:08:402lobby\u显示62015-09-10 03:09:492app\u open12015-09-10 03:10:10:07:073 goonalytics\u get42015-09-10-10-03:10:10:1003:13:403登录成功52015-09-10 03:17:463大厅显示62015-09-10 03:25:023
正如乔尼所说,你必须更好地解释你要做什么。发布的数据是输入数据还是预期结果?如果是输入数据,您已经在那里有了一个
session\u id
;您只需要计算事件之间的间隔吗?如果是,请尝试以下操作(在SQL Server 2012或更高版本中):


正如乔尼所说,你必须更好地解释你想做什么。发布的数据是输入数据还是预期结果?如果是输入数据,您已经在那里有了一个
session\u id
;您只需要计算事件之间的间隔吗?如果是,请尝试以下操作(在SQL Server 2012或更高版本中):


你必须更好地解释你想做什么,也许告诉我们你到目前为止做了什么你必须更好地解释你想做什么,也许告诉我们你到目前为止做了什么谢谢你的回答。我没有会话id,我在Excel中添加了列以显示我想要接收的内容。您有事件编号吗?请编辑您的问题以发布输入数据,并描述您希望如何计算会话id。编辑了问题,但我不知道如何计算会话id。这是我的问题。我试着用ROWNUM()来做,但不起作用…我已经编辑了答案来计算
会话id
(使用
行数()
稠密等级()
)。谢谢你,Razvan Socol,我休假到28.09,只有在我尝试你的代码之后;)谢谢你的回答。我没有会话id,我在Excel中添加了列以显示我想要接收的内容。您有事件编号吗?请编辑您的问题以发布输入数据,并描述您希望如何计算会话id。编辑了问题,但我不知道如何计算会话id。这是我的问题。我试着用ROWNUM()来做,但不起作用…我已经编辑了答案来计算
会话id
(使用
行数()
稠密等级()
)。谢谢你,Razvan Socol,我休假到28.09,只有在我尝试你的代码之后;)
DECLARE @X XML='<table><tbody><tr><th>event_name</th><th>event_number</th><th>timestamp</th><th>session_id</th></tr><tr><td>app_open</td><td>1</td><td>2015-09-10 02:54:04</td><td>1</td></tr><tr><td>crashlytics_init</td><td>2</td><td>2015-09-10 02:54:38</td><td>1</td></tr><tr><td>parse_init</td><td>3</td><td>2015-09-10 02:55:13</td><td>1</td></tr><tr><td>appsflyer_init</td><td>4</td><td>2015-09-10 02:56:10</td><td>1</td></tr><tr><td>googleanalytics_init</td><td>5</td><td>2015-09-10 02:56:54</td><td>1</td></tr><tr><td>login_popup</td><td>6</td><td>2015-09-10 02:57:25</td><td>1</td></tr><tr><td>login_get</td><td>7</td><td>2015-09-10 03:01:27</td><td>1</td></tr><tr><td>login_success</td><td>8</td><td>2015-09-10 03:02:01</td><td>1</td></tr><tr><td>lobby_displayed</td><td>9</td><td>2015-09-10 03:02:44</td><td>1</td></tr><tr><td>app_open</td><td>1</td><td>2015-09-10 03:04:21</td><td>2</td></tr><tr><td>crashlytics_init</td><td>2</td><td>2015-09-10 03:06:07</td><td>2</td></tr><tr><td>parse_init</td><td>3</td><td>2015-09-10 03:07:27</td><td>2</td></tr><tr><td>login_get</td><td>4</td><td>2015-09-10 03:07:27</td><td>2</td></tr><tr><td>login_success</td><td>5</td><td>2015-09-10 03:08:40</td><td>2</td></tr><tr><td>lobby_displayed</td><td>6</td><td>2015-09-10 03:09:49</td><td>2</td></tr><tr><td>app_open</td><td>1</td><td>2015-09-10 03:10:07</td><td>3</td></tr><tr><td>googleanalytics_init</td><td>2</td><td>2015-09-10 03:10:28</td><td>3</td></tr><tr><td>login_popup</td><td>3</td><td>2015-09-10 03:11:35</td><td>3</td></tr><tr><td>login_get</td><td>4</td><td>2015-09-10 03:13:40</td><td>3</td></tr><tr><td>login_success</td><td>5</td><td>2015-09-10 03:17:46</td><td>3</td></tr><tr><td>lobby_displayed</td><td>6</td><td>2015-09-10 03:25:02</td><td>3</td></tr></tbody></table>'
--SELECT @x
SELECT *, CONVERT(time,timestamp-LAG(timestamp) OVER (PARTITION BY session_id ORDER BY event_number)) as interval
FROM (
    SELECT  c.value('td[1]','varchar(100)') as event_name,
            c.value('td[2]','int') as event_number,
            c.value('td[3]','datetime') as timestamp,
            c.value('td[4]','int') as session_id
    FROM @x.nodes('/table/tbody/tr[td!=""]') t(c)
) q
DECLARE @X XML='<table><tbody><tr><th>event_name</th><th>event_number</th><th>timestamp</th><th>session_id</th></tr><tr><td>app_open</td><td>1</td><td>2015-09-10 02:54:04</td><td>1</td></tr><tr><td>crashlytics_init</td><td>2</td><td>2015-09-10 02:54:38</td><td>1</td></tr><tr><td>parse_init</td><td>3</td><td>2015-09-10 02:55:13</td><td>1</td></tr><tr><td>appsflyer_init</td><td>4</td><td>2015-09-10 02:56:10</td><td>1</td></tr><tr><td>googleanalytics_init</td><td>5</td><td>2015-09-10 02:56:54</td><td>1</td></tr><tr><td>login_popup</td><td>6</td><td>2015-09-10 02:57:25</td><td>1</td></tr><tr><td>login_get</td><td>7</td><td>2015-09-10 03:01:27</td><td>1</td></tr><tr><td>login_success</td><td>8</td><td>2015-09-10 03:02:01</td><td>1</td></tr><tr><td>lobby_displayed</td><td>9</td><td>2015-09-10 03:02:44</td><td>1</td></tr><tr><td>app_open</td><td>1</td><td>2015-09-10 03:04:21</td><td>2</td></tr><tr><td>crashlytics_init</td><td>2</td><td>2015-09-10 03:06:07</td><td>2</td></tr><tr><td>parse_init</td><td>3</td><td>2015-09-10 03:07:27</td><td>2</td></tr><tr><td>login_get</td><td>4</td><td>2015-09-10 03:07:27</td><td>2</td></tr><tr><td>login_success</td><td>5</td><td>2015-09-10 03:08:40</td><td>2</td></tr><tr><td>lobby_displayed</td><td>6</td><td>2015-09-10 03:09:49</td><td>2</td></tr><tr><td>app_open</td><td>1</td><td>2015-09-10 03:10:07</td><td>3</td></tr><tr><td>googleanalytics_init</td><td>2</td><td>2015-09-10 03:10:28</td><td>3</td></tr><tr><td>login_popup</td><td>3</td><td>2015-09-10 03:11:35</td><td>3</td></tr><tr><td>login_get</td><td>4</td><td>2015-09-10 03:13:40</td><td>3</td></tr><tr><td>login_success</td><td>5</td><td>2015-09-10 03:17:46</td><td>3</td></tr><tr><td>lobby_displayed</td><td>6</td><td>2015-09-10 03:25:02</td><td>3</td></tr></tbody></table>'
--SELECT @x
SELECT *, CONVERT(time,timestamp-LAG(timestamp) OVER (PARTITION BY session_id ORDER BY event_number)) as interval
FROM (
    SELECT *, DENSE_RANK() OVER (ORDER BY row_num-event_number) AS session_id
    FROM (
        SELECT *, ROW_NUMBER() OVER (ORDER BY timestamp) AS row_num
        FROM (
            SELECT  c.value('td[1]','varchar(100)') as event_name,
                    c.value('td[2]','int') as event_number,
                    c.value('td[3]','datetime') as timestamp
            FROM @x.nodes('/table/tbody/tr[td!=""]') t(c)
        ) q1
    ) q2
) q3