2013-12-11 164 views
3

选择不同值对我有具有表结构如下从SQLite数据库

塔1 SQLite数据库:源IP
塔2:源端口
柱3:目的地IP
柱4:目的端口
柱5:协议
柱6:类型

表中的快照看起来像这样

╔═══╦══════╦═══╦═════╦═════╦═══╗ 
║ A ║ 444 ║ B ║ 555 ║ TCP ║ 2 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ B ║ 555 ║ A ║ 444 ║ TCP ║ 1 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ C ║ 100 ║ A ║ 5525║ UDP ║ 1 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ B ║ 5222 ║ C ║ 2552║ TCP ║ 2 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ A ║ 5525 ║ C ║ 100 ║ UDP ║ 2 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ C ║ 2552 ║ B ║ 5222║ TCP ║ 1 ║ 
╚═══╩══════╩═══╩═════╩═════╩═══╝ 

在上述表格中,您可以看到(A,444),(B,555)和(B,555),(A,444)都有条目。 我想选择的不同的[(源IP,源端口),(目的地IP,目的地端口),(协议)]即,i想要查询,给出了一个输出如下预先

╔═══╦══════╦═══╦═════╦═════╦═══╗ 
║ A ║ 444 ║ B ║ 555 ║ TCP ║ 2 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ B ║ 5222 ║ C ║ 2552║ TCP ║ 2 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ C ║ 100 ║ A ║ 5525║ UDP ║ 1 ║ 
╚═══╩══════╩═══╩═════╩═════╩═══╝ 

由于

+0

'type'列的含义是什么? –

+0

我基于两个系统之间的通信对交通数据进行分类。类型字段用于指定。@ CL。 – swamy

回答

3

下面会做什么:

SELECT *, 
    source_ip<destination_ip OR source_ip=destination_ip AND source_port<destination_port AS _asc 
FROM _table 
GROUP BY 
    CASE WHEN _asc THEN source_ip ELSE destination_ip END, 
    CASE WHEN _asc THEN source_port ELSE destination_port END, 
    CASE WHEN _asc THEN destination_ip ELSE source_ip END, 
    CASE WHEN _asc THEN destination_port ELSE source_port END; 

编辑:按照您的编辑...

SELECT * 
FROM (
    SELECT *, 
     source_ip<destination_ip OR source_ip=destination_ip AND source_port<destination_port AS _asc 
    FROM _table 
    ORDER BY ROWID DESC 
) 
GROUP BY 
    CASE WHEN _asc THEN source_ip ELSE destination_ip END, 
    CASE WHEN _asc THEN source_port ELSE destination_port END, 
    CASE WHEN _asc THEN destination_ip ELSE source_ip END, 
    CASE WHEN _asc THEN destination_port ELSE source_port END; 

MAY工作,

  1. “第一行” 使得在数据库方面没有任何意义,因为ROWID可能会改变。 “第一”仅在应用于列时是有意义的,例如, “第一个端口号”或“按日期添加” - 这意味着您可能需要另一列。

  2. 尽管SQLite接口为每个组选择最后一行(对于未聚合的表达式),但不保证此行为将被维护或在各个版本之间保持一致。

登记SQL Fiddle

+0

你可以再次看看这个问题。我修改了这个要求,它在编辑摘要中。对不起,混淆了@LS_dev – swamy

+1

这是一个不同的问题。无论如何,“第一行”在数据库中没有意义,因为行数据库的顺序可能会改变。有意义的是“首先按......排序”。 –