Eric Hill( 艾瑞克·希尔 ),SAS JMP 首席系统开发人员
注意:这只是论文的文本;不包括截图。请参阅论文的附件版本以获取完整内容。

查询生成器
JMP 12 的新工具可将您的 SQL 数据导入 JMP
(针对 JMP 12.1 进行了更新)
作者:Eric Hill,JMP 软件开发人员
内容
- 介绍. 2
第一部分:建立联系. 3
第 2 部分:选择查询的表. 6
第 3 部分:构建查询. 11
添加列. 十三
保存查询. 15
运行查询. 15
回答问题. 16
- 过滤. 19
提示过滤器. 23
- 采样. 二十五
编写自己的 SQL. 二十六
第 4 部分:管理背景查询. 二十七
查询状态面板 二十八
运行查询窗口..二十八
第 5 部分:共享查询. 二十八
第 6 节:从 JMP 脚本语言 (JSL) 运行查询. 二十九
JMP 12.1 有哪些新功能?. 31
- 搜索. 31
添加相关表. 三十二
作为模板打开. 三十四
编辑计算列公式. 三十四
问题修复. 三十五
- 结论. 三十五
介绍
JMP 为您提供了大量的分析工具,但如果您无法以所需的方式将需要分析的数据导入 JMP,那么这些工具对您来说毫无用处。JMP 长期以来一直支持通过文件 > 数据库 > 打开表将关系数据库中的数据导入 JMP。打开表目前还不错,但它确实有一些明显的局限性:
- 关系数据库中的大多数数据都以规范化的方式存储,需要连接才能获取所需的所有数据,但打开表格不会帮助您进行连接;您必须自己编写 SQL。
- 虽然打开表格提供了用于构建 WHERE 子句的公式编辑器,但它不会显示分类变量的不同值以帮助您对其进行过滤。
- 安全地与他人共享您的查询可能很困难,因为打开表格将您的密码存储在它生成的 JSL 脚本的连接字符串中。
- 打开表格不会帮助您完成导入数据后所需的后处理步骤,例如数据清理、建模类型和格式。
查询生成器从一开始就被设计用来解决打开表格的局限性,帮助您构建具有提示交互式过滤功能的多表查询,并且可以与同事安全地共享。
在本文中,我将使用查询生成器和免费提供的PostgreSQL示例数据库戴尔商店2 。 PostgreSQL是一个开源数据库,可以从此处免费下载:
http://www.postgresql.org/download/
The 戴尔商店2 sample database can be found here:
http://wiki.postgresql.org/wiki/Sample_Databases
戴尔商店2示例数据库也可用于其他数据库平台(MySQL、Oracle 和 SQL Server)。
第一部分:建立联系
Initiate 查询生成器 using File > Database > Query Builder from the menu:
您也可以从JMP 入门第一页启动它:
最后,在 Windows 上,你还可以在主窗口工具栏上找到查询生成器工具:
After launching 查询生成器, you will be greeted with 选择数据库连接 dialog box:
The 选择数据库连接 dialog box is a subset of the 打开表格 window. 查询生成器 and 打开表格 use the same ODBC connections and in fact share connections, so any connections you make in either place will show up in both.
单击“新建连接…”以使用现有 DSN 连接到数据库或创建新的 DSN。系统将提示您提供任何所需的凭据:
连接后,JMP 将从连接中检索模式,以帮助您确保这是您想要的连接:
您还可以看到所选模式中可用的表。单击下一步继续下一步。
JMP 12.2 的新功能: 请注意模式 - 表格面板中的两个搜索框。它们是 JMP 12.1 更新中的新增功能,它们可以在模式和表格列表中进行输入时过滤。我们知道你们中的许多人都有数百个模式,给定模式中有数百个表格,因此新的搜索框可以帮助您缩小列表范围,以便您找到所需内容。
第 2 部分:选择查询的表
图 1:选择查询的表
单击“下一步”后,将出现“选择表”对话框。在“选择表”对话框中,您将选择要包含在查询中的表(参见上面的图 1 )。在“可用表”列表中选择要包含在查询中的表,然后将其添加到右上角的主表和次表列表中。
- 查询中的主表通常是应从中检索所有行的表,无论它们是否在其他表中具有匹配值。用数据仓库术语来说,这是事实表。查询中只能有一个主表。
- 次级表通常是查找表。默认情况下,仅当主表中的列值与次级表中的指定列值匹配时,次级表中的行才会包含在查询中。从数据仓库术语中来说,这些是维度表。您可以根据需要向查询添加任意数量的次级表。
右下方的面板显示所选表的相关信息。Columns选项卡显示表中每列的相关信息,包括它是否是某种键:
JMP 12.2 的新功能:请注意可用表面板中的搜索框,这是 JMP 12.1 中的新功能。当您的架构包含大量表时,使用它来查找您要查找的表。
表快照面板显示数据的快照,以便您可以确保表中包含所需的信息:
通常,在构建查询时,您会想到一个或多个希望回答的问题,这些问题决定了您的查询需要包含哪些表。我们正在探索的数据来自一家虚构的 DVD 租赁公司。我想回答的问题是:
- 哪些类型的电影收入最高?
- 哪些演员的收入最高?
租赁表记录了该公司整个生命周期内发生的每起 DVD 租赁事件,因此该表将成为此查询的主要表。我可以从列面板中看到,租赁表具有与库存表和客户表具有外键关系的列:
图 2:外键
外键关系(也称为外键约束)意味着一个表的列中的值必须在另一个表的主键列中找到。从图 2中,我们可以看到租赁表的inventory_id列中的值必须存在于存货表的主键列中, 租赁表的客户 ID列中的值必须存在于顾客表的主键列中, rentals 表的员工编号列中的值只存在于职员表的主键列中。对于这个查询,我正在寻找有关租借的电影的更多信息,而不是参与租借的工作人员的客户,因此我将存货表作为辅助表添加到查询中。
查看存货表的列面板,我可以进一步看到与电影表的外键关系:
图 3:库存表详细信息
因此电影表也进入查询。查看电影表的详细信息,我看到了一个rental_rate列,这应该是我计算收入所需要的,但我没有看到有关电影类别或电影中演员的任何信息:
图 4:影片表中的列
但是,查看可用表列表,我看到一个电影演员表和一个影片类别表,它们似乎将电影的 ID 映射到其演员和类别,以及包含有关演员和类别的更多信息的演员和类别表。所以我也希望在查询中使用这些表。但是,如果我简单地添加这 4 个表,似乎会出现问题:
图 5:自动加入失败
中间带有“X”的“停止符号”图标表示 JMP 无法自动连接这两个表,因此我必须手动设置连接。如果您发现 JMP 的自动连接功能经常无法完成您需要的操作,您可以通过选择要查询的表旁边的红色三角形将其关闭。
如果我选择公共.电影演员 (t14)并单击“编辑连接”按钮 ( ),则会出现“编辑条件”对话框,允许我配置连接。最初,对话框如下所示:
图 6:编辑连接条件
因为还没有连接条件。我想将film_actor.film_id连接到库存.film_id 。为了实现这一点,我只需从左列列表中选择存货表,然后在两个列表中选择影片编号 :
图 7:编辑连接条件
类似地,我可以将public.film_category的连接条件设置为inventory.film_id = 影片类别.film_id 。这样做之后,情况看起来更好:
图 8:表之间的连接有效
所有辅助表均显示左外连接维恩图图标。以我们刚刚在电影演员和存货之间建立的连接为例,左外连接意味着存货表(在本例中为左表)中的所有行都将包含在查询中,无论电影演员表中是否有匹配项,但只有film_actor表中与inventory表中的行匹配的行才会包含在查询中。
顺便说一下,表名后面括号中的t1 、 t2 、 t3等是 JMP 在将表添加到查询时分配给表的表别名。表别名使生成正确的 SQL 更加容易,并使生成的 SQL 更具可读性。您可以通过右键单击“或次要表”列表中的表并选择“更改别名”来更改表的表别名。表别名不能包含空格或特殊字符。
如果您需要除左外连接以外的其他连接,则可以使用编辑加入对话框中的复选框更改连接类型。连接类型和维恩图图标将发生变化以反映复选框的状态。
图 9:更改连接类型
要检查是否正确设置了连接,您可以单击“预览连接”按钮。这将运行查询并显示前几百行数据的快照,以便您检查一切是否正确。
现在我们已经有了查询中需要的所有表,我们可以单击“构建查询”来调出查询生成器本身,在其中我们可以指定查询中要包含哪些列、要使用的过滤条件、如何对结果数据进行排序等等。
第 3 部分:构建查询
当查询生成器窗口最初针对此查询出现时,它看起来像这样:
- 查询名称框包含查询的名称,默认为主表的名称。查询名称是分配给运行查询后产生的 JMP 数据表的名称,也是将查询保存到文件时的默认文件名。数据源显示查询正在使用的数据源的名称。
- 表格框显示当前查询中的表。要添加或删除表或更改连接,请单击更改…按钮。
- 可用列列表显示查询中所有表的所有列。从此列表中选择列并将其拖到包含的列、过滤器或排序依据面板。或者,如果您愿意,也可以使用右键单击选项来完成相同的操作。
JMP 12.1 中的新增功能:可用列面板现在有一个搜索框,方便您在长列表中查找特定列。与其他搜索框一样,它会在您输入时进行筛选。 - 包含的列面板显示查询包含的所有列的网格。使用包含的列网格设置诸如将数据导入 JMP 后应具有的格式和建模类型之类的内容。如果您希望在数据进入 JMP 之前对其进行汇总,您还可以为列指定聚合和分组依据。
对于支持采样的数据库,此面板中还有一个“示例”选项卡,用于在服务器上生成随机数据样本。 - 此区域中的查询预览选项卡会自动更新,以显示运行查询时将返回的数据快照。SQL选项卡显示查询生成器根据当前选择生成的 SQL。后查询脚本选项卡允许您指定查询完成后将运行的 JSL 脚本。查询状态选项卡显示在后台运行的查询的状态并允许您取消它们。
- 筛选器面板允许您指定过滤数据的条件(创建 WHERE 子句)并将过滤器转变为每次运行查询时运行的提示。
- 排序依据面板允许您指定用于对返回的行进行排序的列(ORDER BY 子句)。
添加列
每个查询都需要一些列。使用以下任一方法向查询添加列:
- 单击“全部添加”按钮以添加查询中所有表的所有可用列
- 从可用列列表中选择特定列,然后单击“添加”或将其拖过来。
- Double-click on a column in the 可用列 list.
对于此查询,我将从电影表中添加影片编号、 标题和rental_rate ,从类别表中添加 category_id和姓名 ,从演员表中添加演员 ID 、 名和姓 。
图 10:最初添加列之后
使用包含的列的JMP 名称、建模类型和格式列,我可以控制数据导入 JMP 后每列的名称、建模类型和格式。
图 11:调整列细节后
出于此分析的目的,我还希望将演员姓名连接成一列,而不是拆分成单独的姓名和姓氏列。为了实现这一点,我可以通过从可用列面板上的红色三角形菜单中选择添加计算列来添加计算列。
这将向可用列列表添加一个名为计算1的列,但我可以右键单击它并使用重命名列将其重命名为演员姓名 ,将其添加到查询并删除名称和姓氏。执行此操作后,查询的预览如下所示:
图 12:带有计算列的查询预览
(这些演员姓名值可能看起来有点奇怪,但实际上它们是来自数据库的正确姓名。演员姓名似乎是通过随机将名字与姓氏配对生成的。)
保存查询
此时,我已经在这个查询上投入了足够多的时间,我想保存它,以免丢失我的工作。只需单击查询生成器窗口右下方的“保存”按钮即可保存查询。系统将提示您提供文件名,默认提供查询名称框中的文本。我将查询命名为影片类别_演员 。查询生成器窗口左下方将显示一条消息,确认查询已保存:
Saving a query creates a file with a .jmp查询 extension. Back on the 查询生成器 window, you’ll notice that the 查询名称 has been changed to match the file name, so it is now 影片类别_演员.
如果您需要创建另一个与已打开的查询类似的查询,但想要保留原始查询,则可以使用另存为...按钮以不同的名称保存副本。
运行查询
此时,我还可以运行查询,以创建包含数据库中所有行的 JMP 数据表。单击查询生成器窗口底部的“运行查询”按钮以运行查询。默认情况下,JMP 在后台运行查询,以便您可以在查询运行时继续工作。使用窗口底部中间部分的“查询状态”选项卡从此查询生成器窗口查看仍在处理的查询的状态,或使用“查看”>“正在运行的查询”查看当前在后台运行的所有查询的状态。这个特定的查询只需一两秒钟,返回 88,020 行:
图13:JMP数据表查询结果
请注意,生成的 JMP 数据表有 3 个脚本和一个定义的SQL表变量:
回答问题
此时,我几乎可以回答我最初寻求答案的问题了,但我必须做出决定:我想让数据库汇总结果,还是想将原始数据导入 JMP 并让 JMP 完成工作?如果原始数据不是太大而无法装入内存,并且导入时间不会太长,那么将原始数据导入 JMP 并进行分析有很多优势 - JMP 比关系数据库更有能力分析数据。
对于手头的任务,只需在类别名称和演员名称上使用“分布”平台,使用租赁率作为频率变量即可。如果我按计数升序对生成的直方图进行排序,我会得到一个可以回答我们两个问题的结果:
图 14:使用分发平台查看查询结果
但是,如果将所有原始数据放入其中的大小或耗时过长,我可以选择使用包含列面板中的聚合列让数据库汇总数据。但是,为此,我需要一次回答两个问题。
To answer the question of 哪些类型的电影收入最高?, I can remove the columns having to do with actor information from the query and ask the database to sum 出租率 grouping by 类别名称, and then I can order the result by the summed 出租率. Here are the steps:
- 单击出租率的聚合列并选择和 。
请注意,对于所有未指定聚合的变量,将检查分组依据。一旦查询中的任何列指定了聚合,则查询中所有未指定聚合的列都需要分组依据列。 - Right-click on the 变量名称 column for 出租率 and select 排序依据.
- 在排序依据面板中选择SUM(t4.租金率) ,然后单击向下的箭头按钮(降序)。
结果如下:
Similarly, taking the category columns back out and putting the actor columns back in, I can answer the question of 哪些演员的收入最高?:
过滤
让我们回到我们的查询正在检索所有原始数据的状态,并使用分配平台来回答我们的收入问题。在 JMP 中进行分析时,我们有一个选项,即我们可以请求 JMP 分析的脚本:
I can then paste that script into the 查询后脚本 panel of 查询生成器:
图 15:添加后查询 JSL 脚本
每次我运行查询时,该脚本都会运行。
现在,我想稍微完善一下我的问题。我可能不想查看数据库中所有租赁的类别和演员收入,而是希望根据电影租赁的国家/地区、租赁商店或特定日期范围来查看。
租赁表有租赁日期和客户 ID字段,所以我几乎得到了我需要的内容。我们之前看到客户 ID是客户表的外键引用。从客户表中,我们可以获得客户所在的国家/地区以及租用 DVD 的商店。
如果我单击查询生成器的表格面板中的改变…按钮,我可以返回并向查询添加更多表。要获取国家/地区信息,我需要将顾客、地址、城市和国家/地区表添加到查询中。幸运的是,借助此数据库管理员设置的关键关系,所有表都自动成功连接。
添加必要的附加表后,返回查询生成器,我可以向查询添加所需的列:租赁日期、 商店 ID和国家。我还设置了友好的 JMP 名称并更正了商店 ID的建模类型:
图 16:添加租赁日期、商店 ID 和国家/地区列后
首先,让我们根据客户的国家/地区进行筛选。我可以右键单击包含的列面板中的t7.国家变量,然后选择过滤方式 。执行此操作后,筛选器面板中会出现针对国家/地区的筛选器:
图 17:国家/地区过滤器
此时,我可以简单地向下滚动国家列表并检查我感兴趣的国家,然后运行查询,并且只会包含来自这些国家/地区的行。
类似地,我可以添加商店 ID和租赁日期的过滤器,之后过滤器面板如下所示:
当我添加租赁日期过滤器时,由于它是一个连续变量,因此默认情况下我会得到一个简单比较过滤器。我想要的是一个范围过滤器。使用t1.租赁日期旁边的红色三角形菜单,我可以将过滤器类型更改为范围:
Now the filter for t1.租赁日期 looks like:
允许我指定日期范围。因此,如果我想查找 2005 年下半年的所有租赁信息,我可以这样做:
图 18:日期范围过滤器
查询生成器中的所有过滤器类型都有一种有效禁用它们的方法,允许您向查询添加多个过滤器,即使对于给定查询,并非所有过滤器都处于活动状态。对于显示值列表的分类过滤器,选择顶部的(全部)项将禁用过滤器。对于请求数字值的过滤器,将值设置为缺失(。)将禁用过滤器(或过滤器的一部分)。所以如果我想要从 2006 年 1 月 1 日开始的所有租赁,我可以这样做:
现在我的查询的筛选器面板如下面的图 19所示。
| 图 19:使用缺失值停用过滤器 | 图 20:具有两个 OR 组的过滤器 |
使用图 19中所示的过滤器选择,现在运行查询将返回客户所在国家/地区为法国或德国且 DVD 在 2006 年 1 月 1 日或之后在商店 2 租借的行。默认情况下,多个过滤器以 AND 连接在一起,因此一行必须匹配所有过滤器才能出现在结果中。如果您需要 OR 过滤器,请单击或者按钮,这将创建另一个过滤器组,并且两个过滤器组将以 OR 连接在一起。例如,上面图 20中所示的过滤器将返回类别为戏剧或电影标题包含“Bucket”的租赁。
提示过滤器
虽然能够在查询生成器中指定过滤条件很不错,但您可能还想创建一个查询,供其他人使用,而这些人实际上并不需要看到整个查询生成器用户界面,但您希望他们每次运行查询时都能输入不同的过滤条件。实现此目的的最简单方法是从筛选器旁边的红色三角形菜单中选择“运行时提示所有条件” :
这会将查询中的所有过滤器都变成提示过滤器。如果您只希望某些过滤器有提示而其他过滤器没有,则可以使用其红色三角形菜单为每个单独的过滤器打开或关闭提示。
设置“运行时提示”后,当我运行此查询时,系统会提示我按我想要的方式设置过滤器值:
提示的默认设置将是查询运行之前在查询生成器中选择的内容(如果查询直接从文件运行,则在保存的查询文件中选择的内容)。
您还可以自定义提示中使用的标签。例如,假设我希望提示显示“客户国家/地区: ”,而不是“国家/地区:”。返回查询生成器,使用t7.国家过滤器的红色三角形菜单,选择配置提示。这将打开一个对话框,允许您更改提示的标签,还可以更改提供提示类别级别的表:
采样
如果您的数据库支持随机抽样,查询生成器顶部中心部分的样本选项卡将显示您的数据库支持的抽样选项。在本文中,我一直使用 PostgreSQL 作为示例,它支持对指定数量的行进行简单随机抽样:
SQL Server 和 Oracle 支持不同的采样选项,因此样本选项卡将反映不同的选项:
| 图 21:SQL Server 采样选项 | 图 22:Oracle 采样选项 |
在数据下载到 JMP 之前,数据库会执行采样,因此这是一种限制从查询中检索到的行数的好方法,否则查询将检索到过多的行。
编写自己的 SQL
我们认识到,尽管查询生成器现在或将来可能有许多功能,但有时您可能需要查询来执行查询生成器不直接支持的操作。此外,您可能已经编写并精心调试了一些 SQL,这些 SQL 执行的正是您需要 JMP 执行的查询。查询生成器有两种选项可用于为查询提供您自己的 SQL:
- 自定义过滤表达式——如果查询生成器在选择表和指定要包含的列方面满足您的需要,但您只想将自定义 SQL 表达式作为过滤器的一部分,则可以从筛选器红色三角形菜单中选择“添加自定义表达式”:
| 图 23:添加自定义过滤表达式 | 图 24:生成的过滤器 |
在自定义表达式框中输入您想要的任何 SQL,只要它是查询的有效 SQL。
如果将自定义表达式过滤器设置为提示过滤器,则自定义表达式将出现在过滤器提示对话框中并可编辑。
- 将整个查询转换为自定义 SQL 查询– 如果您只想为整个查询编写自己的 SQL,那么在启动查询生成器并指定数据连接后,您可以使用查询生成器左上角查询名称字段旁边的红色三角形菜单,然后选择转换为自定义 SQL :
图 25:转换为自定义 SQL
查询生成器窗口将切换到自定义 SQL 模式,为您提供一个较大的区域来输入您自己的 SQL。如果您已开始以交互方式构建查询,则自定义 SQL框将使用根据您迄今为止所做的选择生成的 SQL 进行初始化(见下面的图 26 )。
图 26:自定义 SQL 查询
您可以根据需要编辑 SQL,或从其他来源粘贴 SQL,然后单击“更新”按钮来更新查询预览。一些注意事项:
- 您不能使用自定义 SQL 查询进行提示过滤。
- 将查询转换为自定义 SQL 并编辑 SQL 后,如果将查询恢复为交互式查询,您将丢失对 SQL 所做的任何自定义设置。查询生成器不会尝试解释 SQL。
第 4 部分:管理背景查询
查询生成器默认在后台运行查询,也可以从 JMP 脚本语言 (JSL) 在后台运行查询(请参阅第 6 节)。JMP 提供了两种方式供您查看当前正在运行的后台查询列表,并在必要时停止正在运行的查询。
查询状态面板
在查询生成器的底部中间部分,有一个查询状态选项卡。从该查询生成器窗口启动的任何后台查询都将出现在该选项卡中:
如果您想停止正在运行的查询,只需在列表中选择它并单击“停止”按钮。如果已检索到一些行,JMP 将打开一个数据表,其中包含已检索的所有行。数据表的名称将反映结果是部分的。
运行查询窗口
从主窗口或其他包含菜单的 JMP 窗口的“视图”菜单中,选择“正在运行的查询” 。这将打开一个与查询生成器的查询状态选项卡相同的窗口,但“正在运行的查询”窗口将包含当前在后台运行的所有查询,无论它们是如何调用的(查询生成器窗口或 JMP 脚本语言):
再次选择一个查询并单击停止以停止其运行,打开任何部分结果。
第 5 部分:共享查询
在介绍中,提到打开表格创建的脚本很难共享,因为数据库密码包含在连接字符串中。查询生成器的工作方式不同。如果您为需要密码连接的查询保存.jmp 查询文件,并在文本编辑器中打开该文件,您将看到类似以下内容:
您可以看到用户名 ( 唯一标识 ) 存在于连接字符串中,但随后您会看到密码=%_PWD_% 。“%_PWD_%”不是密码;它是查询生成器放在那里的占位符。当查询生成器看到该占位符时,它知道最初需要密码,因此如果在打开此查询的用户尚未连接到Postgres 数据库 DSN 时打开此查询,查询生成器就会知道提示用户输入密码。
那么 DSN 本身呢?如果您将此 .jmpquery 文件发送给 JMP 用户,而该用户在其计算机上没有定义名为Postgres dvdrental 的DSN,会怎么样?在这种情况下,打开表格无法继续,但查询生成器将通知用户这种情况,并让他们有机会连接到不同的 DSN(可能连接到同一个数据库)或创建一个新的 DSN。
由于不同用户的机器上可能定义不同的 DSN,一些组织已转向无 DSN 的连接。查询生成器目前无法将基于 DSN 的连接字符串转换为无 DSN 的连接字符串,但如果您更改查询脚本中的连接字符串,使其指定司机和服务器而不是指定直接连接网络 ,则查询生成器将在它生成的任何脚本或 .jmpquery 文件中传播此无 DSN 的连接。
第 6 节:从 JMP 脚本语言 (JSL) 运行查询
查询生成器构建的查询也可以从JMP 脚本语言 (JSL)脚本运行。最佳选择是将查询保存为.jmp 查询文件,从 JSL 打开并运行它。例如,假设您在c:\用户\公共\temp文件夹中保存了一个名为pg_rentals.jmpquery的查询。以下是您可以从 JSL 对该查询文件执行的一些操作:
打开( “c:\users\public\temp\pg_rentals.jmpquery” );
询问= 打开( “c:\users\public\temp\pg_rentals.jmpquery”,私人的);
- Open the query in 查询生成器 for editing:
询问<< 调整;
询问<< 跑步();
- 在前台运行查询。查询完成后,结果数据表将在 JMP 中打开。dtResult 将是对结果数据表的引用。
dt结果=询问<< 运行前台();
- 在前台运行查询,但不要打开 JMP 中的结果数据表;请将其保密。dtResult 将是对结果数据表的引用。
dt结果=询问<< 运行前台(私人的);
- 在后台运行查询。查询完成后,结果数据表将在 JMP 中打开。后台运行无法返回对结果数据表的引用,因为查询只是在后台启动。以下示例显示了如何在后台运行查询时获取对结果数据表的引用。
询问<< 运行背景();
- 在后台运行查询。如果查询成功,则在结果数据表上调用分发平台( 查询结果是运行完成脚本中引用结果数据表的特殊 JSL 变量)。如果查询被用户取消或出现错误,则向 JMP 日志写入一条消息。
询问<< 运行背景(
运行完成时(
查询结果<< 分配( 名义分布( 柱子( :标题) ) );
),
运行取消(写( “\!N查询已取消!” ) ),
出现错误时(写( “\!NError 运行查询!” ); )
);
- 在后台运行查询。查询成功完成后,调用 MyFunc 函数。查询结果数据表始终作为第一个参数传递给函数。
::函数= 功能({日期},{默认本地},
写( “\!n租赁次数:”, 行数(日期) );
日期<< 分配( 名义分布( 柱子( :标题) ) );
);
询问<< 运行背景(运行完成时(::MyFunc ) );
如果从 JSL 脚本中单独的 .jmpquery 文件打开查询不令人满意,您可以从查询生成器窗口左上角的红色三角形菜单中获取用于创建查询脚本对象的原始脚本:
例如,调用“保存运行脚本到脚本窗口”进行简单查询会得到以下结果:
新的 SQL 查询返回一个 SQL 查询脚本对象,就像打开.jmpquery 文件时所做的那样,并且可以以相同的方式使用。
JMP 12.1 有哪些新功能?
搜索
我们采访过的许多人的数据库中都有数百个模式、表格和列,其中包含大量数据。在 JMP 12.1 版查询生成器中,我们在模式、表格和列的列表中添加了搜索框,以帮助您快速找到所需的内容:
所有这些搜索框都会在您输入时更新,并且您可以选择使用正则表达式来优化搜索。
添加相关表
在选择要查询的表对话框中,如果添加到查询中的表具有对其他表的外键引用,则可以通过单击“添加相关表”按钮将所有这些相关表添加到查询中。
作为模板打开
通常,您需要构建一个查询,该查询与您已构建并保存到 .jmpquery 文件的另一个查询非常相似。您始终可以打开之前保存的查询,对其进行更改,然后使用“另存为”将其保存到另一个 .jmpquery 文件中,但如果您不小心点击了“保存” ,您的原始查询将被覆盖。“作为模板打开”功能可以防止这种情况发生。在 Mac 和 Windows 上,可以从 .jmpquery 文件的主窗口上下文菜单中打开“作为模板打开” :
当您将 .jmpquery 作为模板打开时,实际上是打开了原始查询的副本,该副本与磁盘上的 .jmpquery 文件没有任何关联。如果您将查询作为模板打开,进行了更改,然后意外点击了保存按钮,系统将提示您提供一个文件来保存查询。
您还可以从 JMP 脚本语言 (JSL) 打开 .jmpquery 文件作为模板:
打开( “C:\Users\Public\Temp\rentals.jmpquery”,作为模板);
编辑计算列公式
在 JMP 12.0 中,您可以向查询添加计算列,该列将在数据库服务器上进行计算,并在查询中返回结果值。但是,如果您需要编辑之前创建的计算列的公式,则无法执行此操作。相反,您必须删除计算列并添加新列,这可能需要您重新创建复杂的公式。在 JMP 12.1 中,您现在可以选择编辑计算列。只需右键单击“可用列”中的列并选择“编辑公式”即可:
问题修复
正如您所期望的,我们修复了 JMP 12.1 中查询生成器的许多错误,其中一些是客户报告的。如果您在使用查询生成器时遇到问题,请通过 SAS 技术支持报告问题,以便我们解决。
结论
查询生成器是 JMP 12 中的一项新功能(在 JMP 12.1 中更新),可帮助您针对关系数据库构建高度自定义的多表 SQL 查询。目标是让您能够比以前更快地以可分析的形式将数据导入 JMP,并更轻松地安全地共享查询。我们希望您能试用并向我们发送反馈(eric.hill@jmp.com) 什么对你有用,什么对你没用。