Sql 查询以从IP地址列表中获取最高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获得
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,因为我仍处于开发阶段。转换函数仍将使用。