2012-02-11 50 views
1

我有IP地址的列表,在表中与客户主机一起使用foriegn键字段分组成:查询从IP列表获得最高的IP地址

ReqID, Hostname, IPAddress 
4, Server01, 192.168.10.5 
4, Server02, 192.168.10.6 
4, Server10, 192.168.10.7 
4, Server15, 192.168.10.8 
4, Server18, 192.168.10.9 
4, Server23, 192.168.10.10 

的IP的是以varchars存储。

我想为特定的ReqID获取最高分配的IP。我将如何做到这一点?

编辑:我有SQL 2005

+0

你如何存储IP地址?作为Varchar? – 2012-02-11 13:51:46

+0

@johntotetwoo - 查看倒数第二行。 – 2012-02-11 13:53:21

+1

使用abcd作为IP地址,并且对于f:= d * 256^0 + c * 256^1 + b * 256^2 + a * 256^3,函数y = f(a,b,c,d)和bigint是一个int64,存储y为bigint,那么你可以简单地做一个MAX(y) – 2012-02-11 15:22:14

回答

4

您可以使用此功能的IP转换成数字:

--Author: Faisal Khan (http://www.stardeveloper.com) 
CREATE FUNCTION [dbo].[ConvertIPToLong](@IP varchar(15)) 
RETURNS bigint 
AS 
BEGIN 
    DECLARE @Long bigint 
    SET @Long = CONVERT(bigint, PARSENAME(@IP, 4)) * 256 * 256 * 256 + 
     CONVERT(bigint, PARSENAME(@IP, 3)) * 256 * 256 + 
     CONVERT(bigint, PARSENAME(@IP, 2)) * 256 + 
     CONVERT(bigint, PARSENAME(@IP, 1)) 

    RETURN (@Long) 
END 

(从here

然后

select reqid, max([dbo].ConvertIPToLong(IPAddress)) as maxIP 
from your_table 
group by reqID 

编辑:来自同一来源你可以使用

-- Author: Faisal Khan (http://www.stardeveloper.com) 
CREATE FUNCTION [dbo].[ConvertLongToIP](@Long bigint) 
RETURNS varchar(15) 
AS 
BEGIN 
    DECLARE @IP varchar(15) 
    DECLARE @TempLong bigint 
    DECLARE @Temp bigint 

    SET @TempLong = @Long 
    SET @Temp = @TempLong/(256 * 256 * 256) 
    SET @TempLong = @TempLong - (@Temp * 256 * 256 * 256) 
    SET @IP = CONVERT(varchar(3), @Temp) + '.' 
    SET @Temp = @TempLong/(256 * 256) 
    SET @TempLong = @TempLong - (@Temp * 256 * 256) 
    SET @IP = @IP + CONVERT(varchar(3), @Temp) + '.' 
    SET @Temp = @TempLong/256 
    SET @TempLong = @TempLong - (@Temp * 256) 
    SET @IP = @IP + CONVERT(varchar(3), @Temp) + '.' 
    SET @Temp = @TempLong 
    SET @TempLong = @TempLong - @Temp 
    SET @IP = @IP + CONVERT(varchar(3), @Temp) 

    RETURN (@IP) 
END 

和查询将

select reqid, [dbo].ConvertLongToIP(max([dbo].ConvertIPToLong(IPAddress))) as maxIP 
from your_table 
group by reqID 
+1

+1应该在2005年工作,但你可能需要另一个函数来映射它。 – 2012-02-11 14:19:07

+0

转换功能看起来不错,但我需要得到一个特定ReqID的实际最高IP。您的查询将返回最高IP的ReqID和Long表示。 – 2012-02-11 14:19:20

+0

@TomPickles在链接表明你有函数ConvertLongToIP():) – 2012-02-11 14:59:42

4

对于SQL Server 2008

SELECT ReqID, 
     REPLACE(MAX(CAST('/'+ IPAddress +'/' AS HIERARCHYID)).ToString(), '/', '') 
FROM your_table 
GROUP BY ReqID 

对于SQL Server尽管它缺少往返功能2005也想不出更好的办法比@Florin's answer背部。

CREATE FUNCTION [dbo].[ConvertIPToString](@IP bigint) 
RETURNS varchar(15) 
AS 
BEGIN 
    RETURN (
     SELECT LTRIM(I3) + '.'+ LTRIM(J3) + '.' + LTRIM(J2) + '.' + LTRIM(J1) 
     FROM (SELECT @IP/256, @IP % 256) T1(I1, J1) 
     CROSS APPLY (SELECT I1/256, I1%256) T2(I2, J2) 
     CROSS APPLY (SELECT I2/256, I2%256) T3(I3, J3) 
    ) 
END