Sql 查询以从IP地址列表中获取最高IP

Sql 查询以从IP地址列表中获取最高IP,sql,tsql,Sql,Tsql,我在一个表中列出了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存储为VARCHAR 我想为特定的ReqID获得

我在一个表中列出了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存储为VARCHAR

我想为特定的ReqID获得最高分配的IP。我该怎么做

编辑:我有SQL Server 2008的SQL 2005

SELECT ReqID, 
       REPLACE(MAX(CAST('/'+ IPAddress +'/' AS HIERARCHYID)).ToString(), '/', '') 
FROM   your_table 
GROUP  BY ReqID 
对于SQLServer2005来说,尽管缺少一个往返的函数,但没有比这更好的方法了

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
适用于SQL Server 2008

SELECT ReqID, 
       REPLACE(MAX(CAST('/'+ IPAddress +'/' AS HIERARCHYID)).ToString(), '/', '') 
FROM   your_table 
GROUP  BY ReqID 
对于SQLServer2005来说,尽管缺少一个往返的函数,但没有比这更好的方法了

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

您可以使用此功能将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
(来自)

然后

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

您可以使用此功能将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
(来自)

然后

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

如何存储IP地址?as Varchar?@johntotetwoo-见倒数第二行。a.b.c.d是IP地址,函数y=f(a,b,c,d)表示f:=d*256^0+c*256^1+b*256^2+a*256^3,bigint是int64,将y存储为bigint,那么您可以简单地执行MAX(y)如何存储IP地址?as Varchar?@johntotetwoo-参见倒数第二行。如果a.b.c.d是IP地址,函数y=f(a,b,c,d)表示f:=d*256^0+c*256^1+b*256^2+a*256^3,而bigint是int64,则将y存储为bigint,然后只需执行MAX(y)即可+1应该可以在2005年使用,不过您可能需要另一个函数来映射它。convert函数看起来不错,但是我需要为特定的ReqID获取实际的最高IP。您的查询将返回ReqID和最高IP的长表示形式。@链接处的TomPickles表明您具有函数ConvertLongToIP():)@FlorinGhita谢谢。这个网页使阅读变得有趣。我想我会修改我的数据库,将IP存储为bigint,因为我仍处于开发阶段。转换函数仍将使用。+1应该在2005年起作用,尽管您可能需要另一个函数来映射它。转换函数看起来不错,但我需要为特定的ReqID获取实际的最高IP。您的查询将返回ReqID和最高IP的长表示形式。@链接处的TomPickles表明您具有函数ConvertLongToIP():)@FlorinGhita谢谢。这个网页使阅读变得有趣。我想我会修改我的数据库,将IP存储为bigint,因为我仍处于开发阶段。转换函数仍将使用。