【问题标题】:List users that are part of maximum concurrency session列出属于最大并发会话的用户
【发布时间】:2016-02-07 10:33:35
【问题描述】:

我有一个包含如下数据的数据库表。我正在尝试列出属于最大并发用户数条件的用户。 通过使用 Itzik Ben_Gan 提供的解决方案,我能够获得最大并发,在 Google 上简单查找“计算并发会话,第 3 部分”将带您到达那里。对于这个数据集,答案是 3(会话行结束 174,175,176) 我研究了网络,但到目前为止只找到了简单计算并发会话数的方法。我想进一步扩展它并获得并发的实际用户。

我也尝试过类似的方法。

选择 L.VISIT_ID、L.PARTY_ID、L.FROM_DATE,

(从 VISIT2 L2 中选择 COUNT(*) WHERE L2.PARTY_ID != L.PARTY_ID AND L2.FROM_DATE

(从 VISIT2 L2 中选择 COUNT(*) WHERE L2.PARTY_ID = L.PARTY_ID AND L2.THRU_DATE

来自 VISIT2 L

我的预期结果是

  • PARTY_ID
  • 1000008021
  • 1000006018
  • 1000000002

下面是表格以及创建表格的查询。

感谢大家愿意花时间提出建议。

<style type="text/css">
  table.tableizer-table {
    font-size: 12px;
    border: 1px solid #CCC;
    font-family: Arial, Helvetica, sans-serif;
  }
  .tableizer-table td {
    padding: 4px;
    margin: 3px;
    border: 1px solid #ccc;
  }
  .tableizer-table th {
    background-color: #104E8B;
    color: #FFF;
    font-weight: bold;
  }
</style>
<table class="tableizer-table">
  <tr class="tableizer-firstrow">
    <th>VISIT_ID</th>
    <th>PARTY_ID</th>
    <th>FROM_DATE</th>
    <th>THRU_DATE</th>
  </tr>
  <tr>
    <td>1000019158</td>
    <td>1000009015</td>
    <td>2014-02-18 00:57:04.837</td>
    <td>2014-02-18 02:08:22.003</td>
  </tr>
  <tr>
    <td>1000019159</td>
    <td>1000006000</td>
    <td>2014-02-18 08:21:04.227</td>
    <td>2014-02-18 10:29:28.477</td>
  </tr>
  <tr>
    <td>1000019160</td>
    <td>1000008018</td>
    <td>2014-02-18 08:49:21.937</td>
    <td>2014-02-18 09:13:10.937</td>
  </tr>
  <tr>
    <td>1000019161</td>
    <td>1000006019</td>
    <td>2014-02-18 09:27:43.657</td>
    <td>2014-02-18 10:30:17.437</td>
  </tr>
  <tr>
    <td>1000019162</td>
    <td>1000007007</td>
    <td>2014-02-18 10:13:14.520</td>
    <td>2014-02-18 10:29:07.733</td>
  </tr>
  <tr>
    <td>1000019163</td>
    <td>1000008011</td>
    <td>2014-02-18 11:01:14.217</td>
    <td>2014-02-18 11:07:20.047</td>
  </tr>
  <tr>
    <td>1000019164</td>
    <td>1000007011</td>
    <td>2014-02-18 11:05:19.570</td>
    <td>2014-02-18 12:48:20.787</td>
  </tr>
  <tr>
    <td>1000019165</td>
    <td>1000008018</td>
    <td>2014-02-18 11:37:52.123</td>
    <td>2014-02-18 14:55:55.593</td>
  </tr>
  <tr>
    <td>1000019166</td>
    <td>NULL</td>
    <td>2014-02-18 11:40:33.583</td>
    <td>2014-02-18 11:40:33.583</td>
  </tr>
  <tr>
    <td>1000019167</td>
    <td>NULL</td>
    <td>2014-02-18 11:40:47.573</td>
    <td>2014-02-18 11:40:47.573</td>
  </tr>
  <tr>
    <td>1000019168</td>
    <td>NULL</td>
    <td>2014-02-18 11:40:54.653</td>
    <td>2014-02-18 11:40:54.653</td>
  </tr>
  <tr>
    <td>1000019169</td>
    <td>1000007030</td>
    <td>2014-02-18 12:15:24.957</td>
    <td>2014-02-18 14:09:14.417</td>
  </tr>
  <tr>
    <td>1000019170</td>
    <td>NULL</td>
    <td>2014-02-18 15:32:53.630</td>
    <td>2014-02-18 15:35:02.327</td>
  </tr>
  <tr>
    <td>1000019171</td>
    <td>1000008018</td>
    <td>2014-02-18 15:34:05.667</td>
    <td>2014-02-18 16:23:50.257</td>
  </tr>
  <tr>
    <td>1000019172</td>
    <td>1000000002</td>
    <td>2014-02-18 16:31:04.303</td>
    <td>2014-02-18 17:09:37.147</td>
  </tr>
  <tr>
    <td>1000019173</td>
    <td>1000006008</td>
    <td>2014-02-18 16:41:35.013</td>
    <td>2014-02-18 17:14:53.093</td>
  </tr>
  <tr>
    <td>1000019174</td>
    <td>1000008021</td>
    <td>2014-02-18 17:40:07.073</td>
    <td>2014-02-18 20:10:40.720</td>
  </tr>
  <tr>
    <td>1000019175</td>
    <td>1000006018</td>
    <td>2014-02-18 18:43:06.783</td>
    <td>2014-02-18 18:49:16.310</td>
  </tr>
  <tr>
    <td>1000019176</td>
    <td>1000000002</td>
    <td>2014-02-18 19:57:35.370</td>
    <td>2014-02-18 19:57:49.297</td>
  </tr>
  <tr>
    <td>1000019177</td>
    <td>1000008021</td>
    <td>2014-02-18 20:10:43.693</td>
    <td>2014-02-18 20:32:34.370</td>
  </tr>
  <tr>
    <td>1000019178</td>
    <td>1000006018</td>
    <td>2014-02-18 22:26:35.477</td>
    <td>2014-02-18 22:26:49.773</td>
  </tr>
  <tr>
    <td>1000019179</td>
    <td>1000000002</td>
    <td>2014-02-18 22:27:37.017</td>
    <td>2014-02-18 22:31:14.750</td>
  </tr>
  <tr>
    <td>1000019180</td>
    <td>1000009016</td>
    <td>2014-02-18 22:40:17.093</td>
    <td>2014-02-18 22:40:32.523</td>
  </tr>
  <tr>
    <td>1000019181</td>
    <td>1000008021</td>
    <td>2014-02-18 23:12:04.840</td>
    <td>2014-02-18 23:23:27.990</td>
  </tr>
  <tr>
    <td>1000019182</td>
    <td>1000000002</td>
    <td>2014-02-18 23:20:09.737</td>
    <td>2014-02-18 23:26:29.827</td>
  </tr>
</table>
​

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[VISIT2](
	[VISIT_ID] [nvarchar](20) NOT NULL,
	[USER_LOGIN_ID] [nvarchar](255) NULL,
	[PARTY_ID] [nvarchar](20) NULL,
	[FROM_DATE] [datetime] NULL,
	[THRU_DATE] [datetime] NULL
) ON [PRIMARY]

GO

【问题讨论】:

    标签: sql-server session concurrency window-functions


    【解决方案1】:

    我只是猜测了您的数据。我继续并交叉应用了与另一个用户有超过重叠时间的所有用户。这将告诉你什么时候在那里,还有谁在同一时间。您也可以先按日期对其进行分组,这样您就可以知道一个时间范围,而不是同时在场的用户。我也给了你一个小提琴。 http://sqlfiddle.com/#!3/20fa29/2

        SELECT * 
    FROM VISIT2 src
    CROSS APPLY(
      SELECT USER_LOGIN_ID +','
      FROM VISIT2 ins
      where src.party_id = ins.party_id
      and ins.from_date between src.from_date and src.thru_Date
      for xml path('')
      ) otherguests(ids)
    

    【讨论】:

    • 感谢您的回复。虽然这没有回答我的问题,但它帮助我意识到有两种情况下并发是 3,因此有 2 组答案。这些用于 visit_id 行 159,160,161,162。请注意,159 先登录,然后是 160,但此用户在访问者 161 之前注销,然后是 162 最后登录。您的查询仅将每行的 FROM_DATE 与交叉表进行比较,其中还应包括 THRU_DATE。此外,您需要使用 src.party_id != ins.party_id 这样您就不会比较自己。还有其他人愿意提供进一步帮助吗?谢谢
    • 实际上在玩弄了您的建议之后,我才明白了这一点。注意我使用 DISTINCT 删除重复项 SELECT * FROM VISIT2 SRC CROSS APPLY( SELECT USER_LOGIN_ID +',' FROM VISIT2 INS WHERE SRC.PARTY_ID != INS.PARTY_ID AND INS.FROM_DATE BETWEEN SRC.FROM_DATE AND SRC.THRU_DATE AND INS.THRU_DATE
    • 顺便说一句,其他并发发生在访问 174,175,176 期间。我只是写下所有这些反馈,以便其他人受益。 @JStead,如果您在上面更正您的回复,我会将其标记为已回答,但也许其他人可以发布一个答案,其中回复作为单独的行返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多