【发布时间】:2013-10-02 14:41:45
【问题描述】:
我有几个用R 编写的程序,现在我需要翻译成 T-SQL 以将它们交付给客户端。我是 T-SQL 新手,在翻译所有 R 函数时遇到了一些困难。
一个例子是数值导数函数,它对于两个输入列(值和时间)将返回另一列(具有相同长度)和计算的导数。
我目前的理解是:
我不能使用 SP,因为我需要使用这些函数内联
select声明,例如:SELECT Customer_ID, Date, Amount, derivative(Amount, Date) FROM Customer_Detail-
我不能使用 UDF,因为它们只能将标量作为输入参数。由于速度的原因,我需要矢量化函数,而且对于我拥有的某些函数,例如上面的函数,逐行运行没有意义(对于每个值,它需要下一个和上一个)
李> - UDA 占用整个列,但顾名思义...,它们会像
sum或avg那样聚合列。
如果以上正确,还有哪些其他技术可以让我创建我需要的函数类型?SQL 内置函数的示例类似于我所追求的 @ 987654330@ (显然)采用一列并返回自身^2。我的目标是创建一个函数库,其行为类似于square、power 等。但在内部它会有所不同,因为square 获取并返回通过行读取的每个标量。我想知道是否有可能让 User Defied 使用累积方法(如 UDA)能够在导入结束时对所有数据进行操作,然后返回相同长度的列?
注意:目前我使用的是 SQL-Server 2005,但我们很快就会切换到 2012 年(或者可能在几个月后切换到 2014 年),因此基于任何 2005+ 版本的 SQL-Server 的答案都可以。
编辑:为 R 开发人员添加了 R 标签,希望他们已经面临这样的困难。
EDIT2:添加了CLR 标签:我浏览了CLR 用户定义的聚合,如 Pro t-sql 2005 程序员指南中定义的那样。我在上面已经说过这种类型的功能不适合我的需求,但值得研究一下。 UDA 需要的 4 种方法是:Init、Accumulate、Merge 和 Terminate。我的请求需要UDA 的同一个实例一起分析整个数据。因此,包括 merge 方法将多核处理的部分结果组合在一起的选项将不起作用。
【问题讨论】:
-
为了澄清,如果您的表中有 100 行,并且列有数量,那么返回的结果是取决于单行的数量还是所有行的数量?您的函数 square 示例采用单个值并返回单个值。像 sum 这样的函数处理多行。你想要一个像 sum 这样处理多行来产生结果的函数,还是像 square 这样只需要一行来产生输出的函数?
-
@Vulcronos 我已经为此使用了衍生示例。是的,结果取决于提供给函数的变量中的所有值。
is possible to have User Defied with an accumulate method (like the UDA) able to operates ... ?(我只使用正方形作为可见结构/内联使用的示例,我提到过)。 -
对于您的“EDIT2”:您可以以相同的方式实现合并和累积:将数据存储在一些大的并行数据结构中(例如danieltao.com/ConcurrentList)。当您拥有所有数据后,您可以在 Terminate 中进行真正的聚合。
-
根据文档,UDA 应该与 UDT 一起使用:"
::= system_scalar_type | { [ udt_schema_name.] udt_type_name }" (technet.microsoft.com/en-us/library/ms182741.aspx) -
我认为您可以通过使用技巧来做到这一点。您返回系统标量类型(例如整数),但这只是一个句柄。在后台,您将整个结果存储在 .NET 堆中。然后,您使用 UDF,为其提供句柄和可选的原始输入的一部分。然后,此函数将其映射到实际返回值。换句话说:UDF 将列返回值映射到结果集的每一行。但这是一个相当黑客,这应该是一种最后的解决方案。尤其是资源管理会很困难(释放中间列)。
标签: sql sql-server r clr