Запрос, чтобы получить самый высокий IP из списка IP-адресов - PullRequest
1 голос
/ 11 февраля 2012

У меня есть список IP-адресов в таблице вместе с именем хоста клиента, сгруппированных с использованием поля ключа foriegn следующим образом:

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.

Я хочу получить максимально выделенный IP-адрес для определенного ReqID.Как бы я это сделал?

РЕДАКТИРОВАТЬ: у меня есть SQL 2005

Ответы [ 2 ]

4 голосов
/ 11 февраля 2012

Вы можете конвертировать 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
4 голосов
/ 11 февраля 2012

Для SQL Server 2008

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

Для SQL Server 2005 не придумать лучшего подхода, чем @ ответ Флорина , хотя в нем отсутствует функция для возврата туда и обратно.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...