Snowflake cloud data platform 雪花-返回两个数组之间不同(不相似)的值

在查看了Snowflake文档之后,我找到了名为array_intersectionarray_1、array_2的函数,它将返回两个数组之间的公共值,但我需要使用任何一个数组中都不存在的值来显示数组 例1: 假设我的表中有以下两个数组 array_1 = ['a', 'b', 'c', 'd', 'e'] array_2 = ['a', 'f', 'c', 'g', 'e'] array_1 = ['u', 'v', 'w', 'x', 'y'] array_2 = ['u', 'v', '

Snowflake cloud data platform Snowflake中传统星形模式与宽表性能比较

在为雪花数据仓库设计数据模型时,是否有一个关于哪种类型的模型具有最佳性能的一般规则?具体来说,比较传统的星型模式和宽表 典型的事实表具有存储描述等字段的维度的代理键。如果结构进一步非规范化,并且这些描述被移动(或同时在事实表上移动)会怎么样?这更符合“一张大桌子”的做法。更改任何维度或事实上的值都需要“事实”表中的新记录,这显然会生成更多的数据“这个问题以前在很多变体中都被问过,最新的是 Snowflake的混合列/微分区表存储(以及其他具有纯列结构的数据库)意味着旧的真理不再有效,或者在某种程

Snowflake cloud data platform 雪花数据仓库中的模式版本控制

我感兴趣的是,通过使用模式版本控制,雪花数据库的用户可以不受更改的影响。我一直在研究如何使用连接语法来定义一个模式,在这个模式中,将为每个版本创建一个包含核心表视图的新模式,任何未更改的视图都将被复制,其他被修改的视图将被向后兼容。当用户连接时,理想情况下会为他们提供所需版本的正确连接语法 我遇到的问题是,有多个团队各自拥有与核心业务领域关联的模式,我认为不可能在连接语法中定义多个模式 有没有人在有多个用户、模式和开发团队的环境中实现了这一点 问候, Luke作为发布过程的第一步,您可以将“当前

Snowflake cloud data platform 如何从Snowflake外部S3阶段获取文件名列表?

我正在寻找最好的方法来自动检测S3存储桶中的新文件,然后将数据加载到雪花表中 我知道这可以通过AWS中设置的Snowpipe和SNS、SQS通知来实现,但我希望Snowflake中有一个可用于多个数据源的自包含解决方案 我希望有一个表,该表使用S3存储桶中的文件名进行更新,然后将尚未从S3加载的文件加载到Snowflake中 到目前为止,我发现在Snowflake中自动检测来自外部S3阶段的新文件的唯一方法是使用下面的代码和一个固定时间表上的任务。这将列出文件名,然后使用结果扫描将最后一个查询显

Snowflake cloud data platform 大分区数对性能的影响

我有数百万个分区的表。 我应该减少分区数量以提高性能吗? 根据我在spark应用程序或hive查询系统中的经验,太多的分区对性能不利。在Snowflake中,有微分区,它们是自动管理的。因此,您不必担心微分区的数量 它说: 对所有雪花表自动执行微分区。 表是使用数据的顺序进行透明分区的 它被插入/加载 从这一页,我了解到微分区是由Snowflake管理的,您不需要关注减少分区数(这是最初的问题) 这也有助于理解集群和微分区之间的区别: 如果您阅读了上面的链接,您会发现即使是在大型表上定义集群

Snowflake cloud data platform 雪花查询信用计算

我的一个用户问我是否可以计算在snowflake中执行特定查询所消耗的积分。根据我的理解,我认为这是不可能的,因为信用卡是在仓库级别,而不是查询级别。但我仍然认为如果有人有办法计算每个查询的信用 谢谢如果您正在运行顺序查询,例如使用run all从web UI运行,并且没有其他人共享仓库,那么执行时间*仓库信用度每小时=成本 如果仓库总是排队/运行,那么成本是总仓库成本*sumquery执行时间/总执行时间的比例 如果处理处于循环中,那么任何一个查询都是免费的,因为没有它,其他代码将运行。但是,

Snowflake cloud data platform 雪花:自动化克隆过程

要求:我正在研究如何每天自动化从Prod到dev的克隆过程 无论是Python还是存储过程既然您提到了克隆,我将假设您的Prod和Dev环境位于同一个Snowflake帐户中。您可以很容易地通过一个简单地删除DEV数据库然后克隆PROD数据库的任务来实现这一点。我认为您不需要SP或Python来实现这一点。既然您提到了克隆,我将假设您的Prod和Dev环境位于同一个Snowflake帐户中。您可以很容易地通过一个简单地删除DEV数据库然后克隆PROD数据库的任务来实现这一点。我认为您不需要SP或

Snowflake cloud data platform 雪花-将字符串转换为秒

我得到了以下格式的几个字段的API响应,我想在加载到snowflake目标表时将它们转换为秒数。是否有可能使用雪花内置功能进行转换?否则,请将源数据转换为所需格式 API response "field1":"13 Days 1 Hour 51 Minutes", "field2":"11 Hours 24 Minutes" I want above response to be converted into

Snowflake cloud data platform 嗨,我有一个缺少标准的代码

[![First output][1]][1] [![Second output][2]][2] [![组合输出][3]][3] [![组合脚本][4]][4] 我有这个代码,但R LN-5360中的标准不存在。但是,S中的标准确实存在,其总和值为“30”。但是,当我加入这两个查询时,它会将MonthlyPremium作为“0”而不是“30”。有人能告诉我我做错了什么吗?我无法删除R,因为我有更多现有条件 选择S.Newf、zeroifnullRoundPR+PRE作为MonthlyPremiu

Snowflake cloud data platform 有没有办法从雪花数据库中提取时区?

ORACLE查询:从dual中选择extract(时区缩写为sysdate,时区为“America/New_York”) 是否有任何方法可以在snowflake数据库中获取时区缩写,类似于我们在ORACLE中所做的工作?没有直接的方法可以从snowflake中提取类似于ORACLE的时区缩写。 但是我们可以通过计算两个时区之间的差异来找到它 SELECT cast(your_column AS TIMESTAMP) yourtimecolumn ,decode( extr

Snowflake cloud data platform 雪花日期\u trunc从日期中删除时间

我有雪花列,其中包含yyyy-mm-dd hh:mm:ss格式的日期 我使用下面的函数 date_trunc('DAY', '2019-09-23 12:33:25') 输出:2019-09-23 00:00:00 预计根据:2019-09-23 这是一个错误还是有其他方法可以完全删除时间部分?根据您对日期的处理方式,有一个午夜时间是可以的 如果你真的必须摆脱它,这将起作用: cast(date_trunc('DAY', '2019-09-23 12:33:25') as date) 取决

Snowflake cloud data platform 如何将JSON中的额外列添加到雪花表中?

我不习惯用雪花。我有一个表,其中包含创建该表的原始和完整JSON消息。所以当我询问时,例如 select * from dbo.TradeData 其中一列称为JSON,包含该顺序的完整JSON消息。它将包括构成列的键,例如,该列中消息的一部分是: "ProdGrp": [ { "prodID": "Confectionary:Choc", "prodIDSoruce": "104" }, 如何调整select*from dbo.TradeData查询以将嵌套的Pr

Snowflake cloud data platform 从SnowFlake上的配置文件读取参数(不通过SnowSQL)

我能够从SnowFlake上的本地配置文件中读取参数(使用SnowSQL)。但在生产环境中,SQL将以自动化的方式运行(使用雪花任务) 我在Snowflake中创建了一个调用存储过程的任务。该存储过程接受我想从配置文件中读取的几个参数。因此,相同的存储过程可以用于多个类似的用例 请建议是否有任何解决办法。 参考链接: 尽管上面说“注意任务不支持帐户或用户参数”。您不能从任务中读取配置文件。在我看来,最简单的方法是将配置放在雪花表中,让存储过程从表中读取任何配置 因为我不太确定存储过程是否可以读取

Snowflake cloud data platform 如何检索通过Snowflake javascript API插入的行数?

如果我通过javascript API在Snowflake中运行INSERT/SELECT,无论插入了多少行,返回的行数看起来都是1 myStatement = snowflake.createStatement( {sqlText: mySql} ); myStatement.execute(); rowCount = myStatement.getRowCount(); 有没有一种简单的方法来检索插入的行数? 我做错什么了吗 谢谢当您在存储过程之外插入行时,您将得到一行作为回报,告诉您插

Snowflake cloud data platform 无法取消查询

好的,我不知道这里发生了什么。我有无法取消的失控查询。我有一个查询可以从一个只有250行且大小为1.5KB的表中选择所有行。它现在已经运行了30分钟,应该只需要几毫秒 我试着通过点击工作表上的abort按钮来取消,进入历史记录并选择查询并点击abort,通过SQL基于查询ID中止,通过SQL基于会话ID中止 具有讽刺意味的是,每当我尝试通过SQL中止查询时,它都会显示查询已终止,然后它们仍然显示为正在运行,我等待几分钟,然后重新运行查询,它再次显示为已终止,但它们仍然在运行 我还尝试注销并再次登

Snowflake cloud data platform 雪花-雪花管-SNS-SQS订阅-待定确认

作为SNS配置的一部分,我遵循了链接中提到的所有步骤。但我仍然没有在SQS队列上看到任何消息,即使新文件被丢弃在S3存储桶中。我注意到,添加雪花SQ缺少“创建订阅”步骤。我继续在SNS主题的订阅中添加了Snowflake SQS ARN,但状态显示为“待定确认”。我不确定我们在哪里可以批准此确认??非常感谢在这方面的任何帮助

Snowflake cloud data platform 按第三列添加年份的雪花SQL语法

我在格式(2016-12-31)中有三列作为Date1,然后另一列Term是(3年),然后我想在日期上进行操作,在Date1字段中添加三年,结果将是虚拟列(2019-12-31) 我有datastage中的语法逻辑阶段,我需要将它放入SQL中 datastage语法-DecimalToDecimal(StringToDecimal(DSLink17.Date1[1,4],'ceil')+StringToDecimal(DSLink17.Term[1,1],'ceil'),'suppress_ze

Snowflake cloud data platform 聚类和搜索优化用例雪花

我在MySQL aurora中有一个表,需要迁移到Snowflake。 表的大小为6TB,有30亿行。 对于我们的应用程序,90%的时间使用基于OBJ_ID的查询,该查询返回100到1000条记录 雪花中的DDL类似于MySQL create or replace table app_event ( ID varchar(36) not null primary key, VERSION number, ACT_TYPE varchar(255), EVE_TYPE var

Snowflake cloud data platform 创建模式的最佳实践是什么?

我正在Snowflake中创建新的数据库,并致力于从其他数据源迁移数据。创建模式的最佳实践是什么?我应该为逻辑数据组创建多个模式吗?我应该迁移一个架构中的所有表吗?我应该使用公共模式还是创建新模式?想知道每种方法的优缺点和最佳实践是什么?谢谢 数据库模式将数据分离为不同的实体,并帮助组织数据 A] 最佳做法: 为模式定义命名约定,这样就可以很容易地确定数据相关性和所有权上下文 避免使用系统关键字来命名架构 不要使用特殊字符 无效长名称 明智地使用访问级别,避免对所有用户授予管理员权限 B] 如果

Snowflake cloud data platform 在表中输入数据时运行小脚本

我在snowflake文档中找不到这些信息,所以我决定在这里询问。 我的用例要求我在雪花表中有新的数据条目时运行一个小脚本。我知道snowflake支持SQL任务,但我的要求更数学,我需要一个合适的脚本来解决它。我对脚本的语言很灵活,但我想知道这个工作流是否有持续集成 我知道运行托管在某个云平台上的按需实例的替代解决方案,但我想知道在Snowflake托管的仓库中是否可以实现类似的功能 如有任何回应,我们将不胜感激。提前感谢。您可以使用蒸汽和任务实现您的目标: 在您的表上创建一个流(APPEND

Snowflake cloud data platform 我正在试图编辑\";从一列字符串中选择新行字符,如何修改已加载表中的数据?

我一直试图删除表列中的所有换行符,并用空格替换。我尝试了以下方法: 选择regexp\u replace(列'\n','') 选择regexp\u replace(列“\\n”和“”) 选择regexp\u replace(列“\\\n”和“”) 选择regexp\u replace(列'\r\n?|\n','') 选择replace(列、chr(10)、chr(13)) 选择replace(替换(列,chr(13),“”),chr(10),“”) 选择替换(替换(列,字符(13),“”),字

Snowflake cloud data platform 流和任务存储过程示例,我不知道如何解决javascript问题

我刚刚了解了Snowflake中的流和任务,并测试了用于跟踪成员和注册的示例 我尝试创建一个如下所示的存储过程: 创建或替换过程成员\u更新 返回不为空的字符串 语言javascript 像 $$ var statement=snowflake.createStatement{sqlText:BEGIN}; 语句。执行; var statement=snowflake.createStatement{sqlText:updatemembers SET fee=fee+15,其中fee>0};

Snowflake cloud data platform 雪花雪花!源选项卡已完成

在使用Snowflake的Snowsql cli时,是否有办法启用tab或其他自动完成功能 每当从命令行运行脚本时,我都必须复制并粘贴整个文件路径 [USER]#(Analytics_WH)@PROD.(data_white)>!source[file_name]我遇到了同样的问题,我开始将文件放在同一个文件夹中,然后单击向上箭头,以尽量减少更改整个文件路径的需要。也许还有更好的方法。我在这里代表您创建了一个snowflake社区的想法:“Snowsql目录的自动完成文件路径”,请在snowfl

Snowflake cloud data platform 雪花可以导入第三方ETL平台的元数据并与之集成';他自己要展示端到端的血统?

我正在与一个希望将元数据导入Snowflake的客户一起工作,我想知道我的第三方工具是否可以 1) 工作 2) 与现有体系结构的数据策略保持一致 我收集有关浏览我的制造业市场的用户的数据。我的网站跟踪已登录和未登录用户的会话、视图和购物车。我使用Fivetran将收集web信息(非结构化json)的应用程序导入到我现有的体系结构中。此信息在30天后存档,并用于显示30天的季度摘要。我想复制和保存这些元数据,并在30天后将其转换为雪花 Data: { "Session id": "87461

Snowflake cloud data platform 有没有办法知道上次在snowflake中访问表的时间

我目前正在研究snowflake,我需要查找最后一次通过查询或手动访问snowflake中的表的时间。有人能帮我吗?谢谢你如果你是说使用select,我认为没有一种方法可以通过表来实现,那么你必须监视最后执行的查询以查找该信息: 更新提示:系统$LAST\u CHANGE\u COMMIT\u TIME会提供您所需的信息。 Snowflake中的访问历史是指用户查询是否读取列数据。雪花不记录写操作。用户访问历史可在访问历史视图(本主题中)中找到 ACCESS_HISTORY视图中的每一行包含每个

Snowflake cloud data platform 在Snowflake中克隆的表可以成为源吗?

在雪花中: 我想克隆源代码 对克隆执行操作 将克隆变成源代码 删除原始源 阅读文档时,我解释克隆是一个与源相同的唯一、独立的对象。因此,在我的头脑中,我可以创建一个克隆,删除源代码,然后就可以了。有人在prod环境中这样做过吗 谢谢你的指导。我们已经测试了这个理论,它看起来没有任何副作用,除了在旧源上丢失时间旅行和文件加载历史;但是我们同意。是的,您可以创建克隆并删除克隆的“源”。您也可以通过使用事务来实现相同的效果,但代码更简单: begin transaction; [do o

Snowflake cloud data platform 获取上次数据加载查询中的验证错误时出错

我正在使用外部后台将数据加载到snowflake。此操作在存储过程中执行,该过程从雪花任务调用。该过程使用“复制到查询”将数据加载到表中,然后检查验证错误。要获取验证错误,我使用_last作为作业id 用于将数据复制/加载到雪花表中的查询 COPY INTO conference_created_tmp FROM @conference_created_src/year=2021/month=04/day=15/hour=01/ ON_ERROR = 'SKIP_FILE' 用于获取验证错误的

Snowflake cloud data platform Sqitch在代码中使用符号AND部署存储过程会导致失败

Sqitch部署在一个存储过程脚本上失败,该脚本用于snowflake,并包含该存储过程的JavaScript代码,该存储过程在IF…THEN条件块中有一个双符号(&&&)。斯基奇认为这是一个变量,就我所知,它失败了 请建议如何在注释或存储过程的代码中处理符号(&),以使sqitch忽略雪花文档中的&: 要在不使用替换的情况下使用符号,请使用第二个符号对符号进行转义:&&variable 恕我直言,sqitch不支持除数据库本机变量以外的变量:

Snowflake cloud data platform 雪花-选择所有列,而不写出每一列并取消其中一列

您好,我需要从另一个具有嵌套列(例如:metricscol)的表中创建一个新表,我需要在不写出每列的情况下为新表取消对该列的测试(因为..如果我有100列会怎么样): 还有别的办法吗?我尝试过这个,但没有成功: select io.metrics[0]:category::string as new_id, io.* from og_table io 如果我正确理解了您的问题(您有一个变体列,您希望为每个对象键构造一个列),并且可以使用复制/粘贴,然后应该有这样一种可接受的方法,使用变体列

Snowflake cloud data platform 雪花:超出可表示范围的数字:类型固定[SB16](38,36){nullable},值772.4018280000000000000000

我们为计算构建了一个非常复杂的SQL 此SQL使用多个子查询和分组汇总 执行此SQL时,Snowflake返回一个错误: 超出可表示范围的数字:类型固定[SB16](38,36){nullable},值772.4018280000000000000000 我们使用的所有数字字段的数据类型都是NUMBER(18,6) 似乎雪花引擎在计算时将数据类型扩展为NUMBER(38,36) 但我检查了文档: 医生说最大刻度是12位数 我不知道为什么是编号(38,36) 我们的SQL可能是这样的: SELE

Snowflake cloud data platform 按条件分组的雪花问题

获取此错误 窗口函数[ROW_NUMBER()结束(按顺序8(1)ASC最后为空)] 出现在SELECT、QUICITE和ORDER BY子句之外 您的查询包含两次“分组依据”,要分组依据的列列表包含一列,该列不在所选列列表中,并且大多数查询都被注释掉 下面的查询修复了这3个问题,可能会起作用,但如果没有示例数据,我们无法知道 CREATE TABLE VIKRAMG.LDCONTRACTMULTISEGMENT ( CONTRACTVERSIONID INTEGER, ORIGIN CHAR

Snowflake cloud data platform 在snowflake中设置“表自动聚类”不会对表进行聚类

大约在2周前,我从手动集群转移到了自动集群 下面是我使用的步骤 将表的“自动聚类”更新为“是”。 创建一个中间表并在表中插入记录。 然后通过中间表中的集群键按顺序插入到主表中。 然后我看到到处都是集群。 我曾经也做过手动集群,看到集群做得很好。 但是,在主表中的下一次插入时。集群看起来又有些麻烦 如果我遗漏了什么,请告诉我 请注意: 中间表中加载的数据也是从其他表中插入的。而且那张桌子从来都不是集群式的。我不确定这是否是问题所在。我认为这不应该是问题。您可能需要使用Snowflake提出一个案例

Snowflake cloud data platform 雪花;SQL编译错误:无效的对象类型:';外部#u表';关于GET#DDL(';数据库';,';MyDb';)

在一些雪花数据库中,我可以运行选择GET_DDL('Database','MyDatabase')没有问题,但在另一个代码中,我得到以下错误消息 SQL编译错误:无效的对象类型:“外部_表” 在那个数据库中可能定义了一个外部数据库,但我仍然希望递归地提取数据库上的DDL 我可以使用什么技巧吗?您可以尝试使用描述表上虚拟列的“描述外部表”。 获取DDL函数:外部表支持 在此版本中,函数支持返回DDL语句,该语句可用于重新创建指定的外部表 请注意,当前,指定数据库或架构的GET_DDL输出不包括架

Snowflake cloud data platform 用阵列和dict混合的方法横向展平雪管数据

我有两个不同的结构化json文件,它们是从一个雪管中导入的。唯一的区别是它没有嵌套dict,而是有许多嵌套数组。我正在试图找出如何将结构1转换为一个最终确定的表。我已经成功地将结构2转换为一个表,并包含了下面的代码 我知道我需要利用横向展平,但没有成功 **Structure 1: Nested Arrays (Need help on)** This json lives within a table and in column **JSONTEXT** [ { "ID": "xx

Snowflake cloud data platform 流雪花表更新

雪花端有一个巨大的ETL过程,用于更新表。我需要将对它所做的更改流式传输到snowflake之外的其他消费者处理器。不查询表中的更新,而是流式处理(推模式,而不是拉模式) 我看到有很多例子可以将数据流到snowflake中。有没有一种方法可以把它流到外面?可能使用CDC+流+任务来排队?嗨,Andrey,我还不知道有任何外部流功能,但也许您可以在讨论中的雪花表上创建流。是否有一个任务(每分钟?)运行,将这些更改刷新为S3(或同等版本)上的JSON/CSV,并让外部应用程序/服务从此处消费?这里的

Snowflake cloud data platform 我可以使用snowflake阻止从客户端下载数据吗? 最终用户使用Tableau、workbench和cli访问snowflake 最终用户查阅了数据 最终用户希望保存在其计算机上检索到的数据

雪花能否阻止最终用户在本地保存数据?一般来说,RBAC是一种限制谁可以看到他们应该看到的数据的方法 为了回答您的问题,就在Tableau这样的产品中下载结果而言,Snowflake并不能控制客户端产品在如何共享数据方面的行为 对于从Snowflake(如Snowflake Web UI)下载结果,无法禁用此功能。如果用户可以看到并访问它,他们可以下载它 请随时在此页面上投票支持名为“工作表:启用/禁用用户下载数据(csv/剪贴板)功能的选项”的想法:

Snowflake cloud data platform 将Oracle查询转换为雪花

在将查询从Oracle转换为snowflake时,我遇到了一个问题。你能帮忙吗 Oracle查询示例: 替换(REGEXP_SUBSTR(col_name,(.*)([[:space:]]>[[:space:]].$)”,1,1),“>>”,“”)为test处理正则表达式的(.*)部分时,雪花的行为似乎有所不同。作为解决方法,您可以使用[^>]*或\w+代替(.*): 对于Oracle的REGEXP_SUBSTR,它们应该给出相同的结果(“test1”)。您可以发布一个示例输入和一个预期输出吗。

Snowflake cloud data platform 描述雪花对象需要什么资助?

雪花的描述功能可以应用于许多对象,如用户、仓库或数据库() 我找不到执行所需的补助金。通过实验,我发现了几件事: -在大多数情况下,只允许对象的所有者描述该对象 -异常:允许非所有者执行描述数据库 -(例外:当模式包含外部表时,描述模式失败,但这可能只是没有实现) 我在文件中找不到执行任务所需的一般补助金。我的测试似乎表明没有一般规则,但我很高兴有人能证明我错了:-)根据我的实验,架构下的所有基本对象,如表、过程和函数、文件格式、阶段,如果将其任何特权类型授予访问者,则etc将允许使用描述命令。

Snowflake cloud data platform 雪花中的克隆模式

有可能在Snowflake中选择性地克隆模式吗 例如 原件: DB_OG --方案1 --方案2 --方案3 克隆: DB_克隆 --方案1 --schema3语句不支持应用筛选器、模式或多个对象,其行为是: 对于数据库和架构,克隆是递归的: 克隆数据库将克隆数据库中的所有架构和其他对象 有几种明确的方法可以筛选克隆: 克隆整个数据库,然后使用命令删除不必要的模式 创建一个空数据库,并有选择地仅将源数据库中所需的架构克隆到其中 上述两项也可以通过在以模式或名称列表作为其输入并运行适当的SQL

Snowflake cloud data platform 如何识别雪花模式中只有空值的所有列

(代表雪花客户提交) 需要过滤空数据列,我听说数据库中所有表的所有列的信息都可以在schemainformation\u schema的视图“columns”中找到 然而,我发现这并不能100%准确地显示正确的数据。当我们将约束指定为NOTNULL或它是主键时,它将显示Non nullable。对于其他列,它显示为null。但这是不对的,我们需要实际检查列中的数据,即使有一条记录,那么该列是不可为空的 还有别的办法吗 有什么建议吗?信息模式中的视图旨在描述数据库中表的结构,而不是其内容。通过

Snowflake cloud data platform 雪花:窗口功能';范围';不支持,如何查询?

我有一个交易表,包括txn_日期和客户id 对于每个在12月份有交易的客户,我想知道该客户在给定交易之前的90天内有多少交易 这似乎是一个可以使用窗口函数和范围滑动窗口运行的查询,但Snowflake不支持范围滑动窗口框架 如何在Snowflake中运行此查询?类似这样的内容如何: WITH T1 AS ( SELECT CUSTOMER_ID, TX_DATE FROM TRANSACTIONS WHERE TX_DATE BETWEEN '2020-12-01' AN

  1    2   3   4   5   6  ... 下一页 最后一页 共 17 页