【发布时间】:2020-11-25 07:46:29
【问题描述】:
我目前正在尝试连接从我们的系统日志服务器加载的 SQL Server 上的表中的行。该表列出了我们用户的 VPN 会话,并且始终包含会话的两行:会话开始时记录事件 2201,会话终止时记录事件 2202。
+---------+---------+----------+------ ------------+-------------+----------+------------+ |事件日期时间 |事件ID |用户名 |源代码 |虚拟IP |接收 |交易 | +---------+---------+----------+------ ------------+-------------+----------+------------+ | 2020-11-24 06:22:05 | 2201 | abc1234 | 111.222.333.444 | 172.16.10.2 |空 |空 | | 2020-11-24 13:15:17 | 2201 | abc1234 | 111.222.333.444 | 172.16.10.4 |空 |空 | | 2020-11-24 13:15:27 | 2202 | abc1234 | 111.222.333.444 | 172.16.10.2 | 74411108 | 655423421 | | 2020-11-24 14:40:45 | 2202 | abc1234 | 111.222.333.444 | 172.16.10.4 | 22629095 | 175651830 | | 2020-11-24 20:07:53 | 2201 | abc1234 | 111.222.333.444 | 172.16.10.2 |空 |空 | | 2020-11-24 20:11:45 | 2202 | abc1234 | 111.222.333.444 | 172.16.10.2 | 1086188 | 5786362 | | 2020-11-21 10:39:59 | 2201 | def5678 | 55.66.77.88 | 172.16.10.2 |空 |空 | | 2020-11-21 11:26:49 | 2202 | def5678 | 55.66.77.88 | 172.16.10.2 | 25364309 | 40329362 | | 2020-11-22 10:07:51 | 2201 | def5678 | 55.66.77.88 | 172.16.10.2 |空 |空 | | 2020-11-22 10:33:15 | 2202 | def5678 | 55.66.77.88 | 172.16.10.2 | 7929825 | 34662648 | +---------+---------+----------+------ ------------+-------------+----------+------------+
CREATE TABLE syslog
(
eventdatetime datetime NOT NULL,
eventid smallint NOT NULL,
username varchar(20) NOT NULL,
srcip varchar(15) NOT NULL,
virtual_ip varchar(15) NOT NULL,
rx int NULL,
tx int NULL
)
但是,我不能只按日期和时间对表格进行排序,因为用户可以在不同的设备上创建多个会话。上表显示了前四行中的此类事件。 会话的用户名、srcip 和 virtual_ip 的值相同,但我将有两个时间戳和两个事件 ID。
如何将会话中的这两行组合起来,以便得到这样的输出:
+------------------+----------+------ -----+-----------------+-------------+----------+- ----------+ |开始 |结束 |用户名 |源代码 |虚拟IP |接收 |交易 | +------------------+----------+------ -----+-----------------+-------------+----------+- ----------+ | 2020-11-24 06:22:05 | 2020-11-24 13:15:27 | abc1234 | 111.222.333.444 | 172.16.10.2 | 74411108 | 655423421 | | 2020-11-24 13:15:17 | 2020-11-24 14:40:45 | abc1234 | 111.222.333.444 | 172.16.10.4 | 22629095 | 175651830 | | 2020-11-21 10:39:59 | 2020-11-21 11:26:49 | def5678 | 55.66.77.88 | 172.16.10.2 | 7929825 | 34662648 | +------------------+----------+------ -----+-----------------+-------------+----------+- ----------+【问题讨论】:
-
根据您的示例,每个会话 aof 用户 abc1234 有三个事件
-
但是,我建议使用 cte 来创建行号,例如
ROW_NUMBER() OVER (PARTITION BY username, srcip, virtual_ip ORDER BY eventdatetime)- 之后您可以使用rn = 1从您的 cte 中选择所有行,然后使用rn 2(或类似,因为在您的示例中,用户 def5678 的 rn 将达到 4)。 -
您的表中没有设备标识符吗?
-
@Tyron78 是的,正确,两个重叠了几秒钟,第三个重叠了。
-
@PeterSmith 不幸的是没有。来自 Syslog 服务器的行是从我们的防火墙生成的,我无法更改输出。整行如下所示:
id="2201" severity="info" sys="SecureNet" sub="vpn" event="Connection started" username="abc1234" variant="ssl" srcip="111.222.333.444" virtual_ip="172.16.10.2"
标签: sql-server tsql