查询从IP列表获得最高的IP地址
我有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
您可以使用此功能的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应该在2005年工作,但你可能需要另一个函数来映射它。 – 2012-02-11 14:19:07
转换功能看起来不错,但我需要得到一个特定ReqID的实际最高IP。您的查询将返回最高IP的ReqID和Long表示。 – 2012-02-11 14:19:20
@TomPickles在链接表明你有函数ConvertLongToIP():) – 2012-02-11 14:59:42
对于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
你如何存储IP地址?作为Varchar? – 2012-02-11 13:51:46
@johntotetwoo - 查看倒数第二行。 – 2012-02-11 13:53:21
使用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