【发布时间】:2019-07-18 23:43:56
【问题描述】:
我正在寻求创建一个可以传递单列表的过程,该过程将输出中位数。现在我有一个程序可以确定中位数;但是,我收到的错误是我的@table 表变量尚未声明并且无法找到存储过程。
我的中位数程序:
CREATE OR ALTER PROCEDURE dbo.median
(@table NUMERIC,
@median FLOAT OUTPUT)
AS
DECLARE @size AS NUMERIC
SET @size = (SELECT COUNT(*) FROM @table)
SET @median = (SELECT AVG(1) FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY 1) AS ROW FROM @table) AS subquery
WHERE subquery.ROW = ROUND(@size / 2, 0) OR subquery.ROW = ROUND(@size / 2, 0, 1))
RETURN
GO
调用过程:
DECLARE @Arsenic TABLE(Ar FLOAT)
INSERT INTO @Arsenic SELECT Arsenic from dbo.HubspotWaterTestAverages
EXEC dbo.median (SELECT Arsenic FROM dbo.HubspotWaterTestAverages)
注意:砷代表水测试结果的砷水平,数值范围从零到10
预计工作过程将只返回列的中值,稍后我计划将其交叉连接到主表。感谢您的帮助!
【问题讨论】:
-
如果你想传递一个表值参数,你必须首先定义你的自定义表类型。这在文档中进行了概述。 docs.microsoft.com/en-us/sql/relational-databases/tables/…
-
试试这个:google.com/… 您在存储过程中使用表值参数的尝试看起来不像我见过的任何示例。
-
在 SQL Server 2012 及更高版本上,
PERCENTILE_DISC(0.5)将计算中位数而不需要单独的过程/函数(这很好,因为NUMERIC是NUMERIC(18, 0)的缩写,但一种数字类型,而 T-SQL 不允许在列或参数中使用动态类型,因此编写一个完全通用的median过程将是一个挑战)。 -
@JeroenMostert 我虽然 PERCENTILE_DISC(0.5) 只能用于奇数行?
-
查看我在这个帖子中的回复,也许可以帮到你stackoverflow.com/questions/43083962/…
标签: sql sql-server ssms