2012-02-11 63 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