由于我在SQL方面的能力不强,因此我决定在这里进行首次发布,因为我坚持创建查询几天了,无法弄清楚如何正确地进行查询。我有一个表,该表以历史记录形式保存信息,以根据端口的时间戳保持IP地址以前的状态。我的Java程序正在使用此表来处理IP地址的状态。另外,当状态更改为任何IP地址时,我需要将ACTION DATE之前的最后一个显示为最后一次出现。
DST IP | DST PORT | ACTION DATE | STATUS
-------------------------------------------------------
0.0.0.0 | 80 | 2014.06.12. 9:22:27 | 4
10.146.203.184 | 80 | 2014.06.10. 8:43:51 | 4
10.146.203.184 | 80 | 2014.06.10. 8:43:41 | 4
10.146.203.184 | 80 | 2014.06.10. 8:28:35 | 0
我需要过滤表以根据唯一身份IP地址的最新状态显示它们。
我可以这样做:
SELECT
T1.[DST IP], T1.[DST PORT], MAX(T1.[ACTION DATE]) AS LASTDATE
FROM
IP_BLOCK_LIST AS T1
GROUP BY
T1.[DST IP], T1.[DST PORT]
但我还需要将给定IP和端口的ACTION DATE之前的最后一个显示为LAST OCCURRENCE。因此,我应该得到上述类似的信息:
DST IP | DST PORT | ACTION DATE | STATUS | **LAST OCCURRENCE**
0.0.0.0 |80 | 2014.06.12. 9:22:27 | 4 | 2014.06.12. 9:22:27
10.146.203.184 |80 | 2014.06.10. 8:43:51 | 4 | 2014.06.10. 8:43:41
我有办法从表中获取最后一条记录:
SELECT TOP 1 [ACTION DATE]
FROM (SELECT TOP 2 * FROM IP_BLOCK_LIST ORDER BY [ACTION DATE] DESC) AS T3
ORDER BY T3.[ACTION DATE]
但不适用于每个最新发生的ip端口。
寻求帮助会很棒,因为这使我难以理解。
谢谢。
伊斯特万
更新资料
我终于想到了这个查询:
SELECT T1.[DST IP], T1.RANGE, T1.[DST PORT], T1.STATUS, T1.NOTE, T1.SOURCE, T1.[BLOCK DIRECTION], T1.[ACTION DATE] AS [PERFORM DATE], Q1.[LAST OCCURRENCE] FROM IP_BLOCK_LIST AS T1 LEFT JOIN (SELECT Q2.[DST IP], Q2.[DST PORT], Max(Q2.[ACTION DATE]) AS [MaxOfACTION DATE], Min(Q2.[ACTION DATE]) AS [LAST OCCURRENCE] FROM (SELECT T2.[DST IP], T2.[DST PORT], T2.[ACTION DATE] FROM IP_BLOCK_LIST AS T2 WHERE (T2.[ACTION DATE]) In (SELECT TOP 2 T3.[ACTION DATE] FROM IP_BLOCK_LIST AS T3 WHERE T2.[DST IP] = T3.[DST IP] AND T2.[DST PORT] = T3.[DST PORT] ORDER BY [ACTION DATE] DESC )) AS Q2 GROUP BY Q2.[DST IP], Q2.[DST PORT]) AS Q1 ON (T1.[DST PORT] = Q1.[DST PORT]) AND (T1.[DST IP] = Q1.[DST IP]) WHERE (T1.[ACTION DATE]=[Q1].[MaxOfACTION Date])
可以简化一下吗?
您可以通过使用相关子查询来做到这一点:
select bl.*
from ip_block_list bl
where bl.[ACTION DATE] in (select top 2 bl2.[ACTION DATE]
from ip_block_list bl
where bl2.[DST IP] = bl.[DST IP] and
bl2.[DST PORT] = bl.[DST PORT]
order by [ACTION DATE] desc
);
请注意,在平局的情况下,对于给定的IP,这将返回两个以上的记录。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句