【问题标题】:Tableau - carry out join on IP Numbers SSMSTableau - 对 IP 号码 SSMS 执行联接
【发布时间】:2018-09-19 03:48:27
【问题描述】:

我正在尝试将两个表放入 Tableau。一个具有点格式的 IP 地址,即 192.168.32.1,另一个具有对应于城市和邮政编码等的 IP 数字,我希望将其用于可视化。

想法是执行此处的步骤 (http://kb.tableau.com/articles/howto/mapping-ip-address-geocode-data) 对两个表进行连接,其中连接将一个表中的 IP 地址转换为一个数字,然后可以将其与另一个表中的数字进行比较表。

但是,当我按照此处指南中的步骤操作时,它运行了 40 分钟然后崩溃了。

任何人都可以对此有所了解吗?

我的表在 Microsoft SQL Server Management Studio 中 - 我也研究过使用计算列来做同样的事情,但到目前为止没有运气(我对 SQL 很陌生,不知道如何保存然后应用一个函数,正如这里建议的https://www.stev.org/post/mssqlconvertiptobigint)。

【问题讨论】:

  • 你能在 SSMS 中添加另一个表吗?还是您必须坚持现有结构中的两者?意思是,您是否有权创建一个已为您转换数据的表?这可能比让 Tableau 计算更有效,但比函数更简单。
  • 我确实有权限 - 不幸的是没有专业知识。
  • 这可能比完全处理的要复杂一些,但也许我们可以帮助您入门。
  • 您的 IP 号码表是什么样的?
  • 略低于 400 万行 - 我正在使用来自这里的免费版本 9 lite.ip2location.com - 它使用两列,ipnumber start 和 ipnumber end。两者都是 15 个字符的 varchars

标签: sql sql-server tableau-api


【解决方案1】:

前言:我建议尝试运行下面的查询,看看它是否能正确和快速地转换(作为一个好的经验法则,尽量保持在 30 秒以下)并从那里开始。这可以告诉您在 SQL 或 Tableau 上投入更多时间是否更好。

有很多方法可以采取,这只是我的建议。您可以考虑编写一个查询,该查询创建另一个带有格式化数据的表。设置为在作业(或仅作业)中运行并每隔几分钟(或每晚,您认为合适的任何内容)添加到表中的存储过程将为您提供 SQL 中的基本数据。然后,您可以使用 Tableau 进行连接。

select [IP Address], 
--add as many columns as you want from the base table to take the place of one of the tables you join to
[CodeForIPAddressIntegerFromYourHelpSite] as 'IPINT' 
--converts IP Address to Integer - use the code from your help site
Into [IPIntegerConversion] 
--this will create a permanent table automatically
from YourTableWithIPAddress

此方法将为您提供一个包含 IP 地址和 IP 整数的表,该表允许您在两者之间进行链接(您应该能够将代码从他们的站点粘贴到 [CodeForIPAddressIntegerFromYourHelpSite]。然后,您可以将其设置为在 SQL 代理中自动运行(实际上这很容易)。如果查询本身并不昂贵,您可以将其粘贴到作业中。如果您传递已经计算的数据,它可能会更有效。

【讨论】:

  • 非常感谢 - 我会在尝试查看当前视图失败后立即尝试此操作。目前我是42分钟,所以我并不乐观。快速提问,因为我对语法非常陌生——这里 MSSQL 部分中给出的代码可以工作吗? periscopedata.com/blog/comparing-ip-addresses-in-sql
  • 是的,应该的。
  • Msg 137, Level 15, State 2, Line 18 必须声明标量变量“@ip”。消息 178,级别 15,状态 1,第 22 行 在此上下文中不能使用具有返回值的 RETURN 语句。消息 102,级别 15,状态 1,过程 BINTToIP,第 13 行 [批处理开始第 24 行] 'GO' 附近的语法不正确。我收到此错误消息并且不知所措 - 我只是天真地将第一个链接中的代码粘贴到您指定的位中 - 我这里没有空间发布完整代码,所以我更新我的问题
【解决方案2】:

我认为这应该让你接近:

ParseName 是 SQL Server 中用于解析 IP 地址的函数。我不是知识产权方面的专家,我从大约 5 分钟的谷歌搜索中获得了基础知识。您可能需要颠倒顺序,但这是基本的查询结构,应该很快。

select ip.ip
    ,parsename(ip.ip,4)*16777216 -- 2^24
    +parsename(ip.ip,3)*65536    -- 2^16
    +parsename(ip.ip,2)*256      -- 2^8
    +parsename(ip.ip,1) ip4
    ,ipv4.*
from tableWYourIPs ip
   left join ipv4 on parsename(@ip,4)*16777216 
                        +parsename(@ip,3)*65536 
                        +parsename(@ip,2)*256 
                        +parsename(@ip,1) between ipv4.start and ipv4.end

确保应用网站推荐的索引:

CREATE INDEX [ip_from] ON [ip2location].[dbo].[ip2location_db9]([ip_from]) ON [PRIMARY]
GO

CREATE INDEX [ip_to] ON [ip2location].[dbo].[ip2location_db9]([ip_to]) ON [PRIMARY]
GO

转换遵循以下逻辑: http://blogs.lessthandot.com/index.php/datamgmt/datadesign/how-to-convert-ip-addresses-between-bigi/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多