首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从IP地址列表中获取最高IP的查询。

从IP地址列表中获取最高IP的查询。
EN

Stack Overflow用户
提问于 2012-02-11 13:45:06
回答 2查看 377关注 0票数 1

我在一个表中有一个IP地址列表以及客户端主机名,按照如下方式使用一个foriegn密钥字段进行分组:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-11 13:55:41

您可以使用以下函数将IP转换为数字:

代码语言:javascript
复制
--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

(来自这里)

然后

代码语言:javascript
复制
select reqid, max([dbo].ConvertIPToLong(IPAddress)) as maxIP
from your_table
group by reqID

编辑:可以使用的相同来源的

代码语言:javascript
复制
-- 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 

而查询将是

代码语言:javascript
复制
select reqid, [dbo].ConvertLongToIP(max([dbo].ConvertIPToLong(IPAddress))) as maxIP
from your_table
group by reqID
票数 4
EN

Stack Overflow用户

发布于 2012-02-11 13:50:33

用于Server 2008

代码语言:javascript
复制
SELECT ReqID, 
       REPLACE(MAX(CAST('/'+ IPAddress +'/' AS HIERARCHYID)).ToString(), '/', '') 
FROM   your_table 
GROUP  BY ReqID 

对于Server 2005,没有比@Florin的回答更好的方法了,尽管它缺少一个往返返回的函数。

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9240687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档