合并 SQL 行
我有 SQL Compact 数据库,其中包含 IP 数据包标头表。该表如下所示:
Table: PacketHeaders
ID SrcAddress SrcPort DestAddress DestPort Bytes
1 10.0.25.1 255 10.0.25.50 500 64
2 10.0.25.50 500 10.0.25.1 255 80
3 10.0.25.50 500 10.0.25.1 255 16
4 75.48.0.25 387 74.26.9.40 198 72
5 74.26.9.40 198 75.48.0.25 387 64
6 10.0.25.1 255 10.0.25.50 500 48
我需要执行查询来显示本地网络上正在进行的“对话”。数据包从 A -> 出发B 是与来自 B -> B 的数据包相同会话的一部分。答:我需要执行查询来显示正在进行的对话。基本上我需要的是如下所示的内容:
Returned Query:
SrcAddress SrcPort DestAddress DestPort TotalBytes BytesA->B BytesB->A
10.0.25.1 255 10.0.25.50 500 208 112 96
75.48.0.25 387 74.26.9.40 198 136 72 64
如您所见,我需要查询(或一系列查询)来识别 A->B 与 B->A 相同,并相应地分解字节计数。无论如何,我不是 SQL 专家,但对此的任何帮助将不胜感激。
I've got SQL Compact Database that contains a table of IP Packet Headers. The Table looks like this:
Table: PacketHeaders
ID SrcAddress SrcPort DestAddress DestPort Bytes
1 10.0.25.1 255 10.0.25.50 500 64
2 10.0.25.50 500 10.0.25.1 255 80
3 10.0.25.50 500 10.0.25.1 255 16
4 75.48.0.25 387 74.26.9.40 198 72
5 74.26.9.40 198 75.48.0.25 387 64
6 10.0.25.1 255 10.0.25.50 500 48
I need to perform a query to show 'conversations' going on across a local network. Packets going from A -> B is part of the same conversations as packets going from B -> A. I need to perform a query to show the on going conversations. Basically what I need is something that looks like this:
Returned Query:
SrcAddress SrcPort DestAddress DestPort TotalBytes BytesA->B BytesB->A
10.0.25.1 255 10.0.25.50 500 208 112 96
75.48.0.25 387 74.26.9.40 198 136 72 64
As you can see I need the query (or series of queries) to recognize that A->B is the same as B->A and break up the byte counts accordingly. I'm not a SQL guru by any means but any help on this would be greatly appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
试试这个:
在这个测试数据上:
这给出了以下结果:
它的工作方式是首先对单向对话进行分组并计算字节总数。这确保了每个对话都将被精确地表示两次——每个方向一次。然后将此结果自连接以提供您需要的结果,通过强制 A 的(地址、端口)必须小于 B 来过滤重复项。左连接用于允许单向对话。
Try this:
On this test data:
This gives the following results:
The way it works is to first group one-way conversations and total the byte counts. This assures that every conversation will be represented exactly twice - once for each direction. This result is then self-joined to give the result you need, filtering the duplicates by enforcing that the (address, port) of A must be less than B. A left join is used to allow one-way conversations.
我可以看到两种基本方法......
1. 将其全部分组,忽略 a->b 和 b->a,然后对结果进行自连接。
2. 在“src”字段中使用“最低”IP 地址重新排列数据,同时创建一个“方向”字段。
选项 2 可能是我会选择的方式...
编辑
其他几个答案都有我所说的选项 1 的版本。我也会尝试一下,而不是在人们的帖子上发送垃圾评论答案 :(
但我确实说过我不会那样做......
I can see two basic ways of doing this...
1. Group it all up, ignoring the a->b and b->a and then self join the results.
2. Rearrange your data with the "lowest" ip address in the 'src' field, but also create a 'direction' field.
Option 2 is probably the way I'd go...
EDIT
A couple of other answers have version of what I called option 1. I'll have a go at it too rather than spamming comments on people's answers :(
But I did say I wouldn't do it that way...