我有包含两个字段的表(更多,但不相关)。这些字段是价格和数量。我想找到这张表的几个统计数据,其中中间价格调整为数量。
今天我有一个基本慢的不是好看的函数,它将总数量除以2,然后按照价格排序记录并从总数量中减去数量。当总量达到0时,我有我的中位数。
正如你所猜测的,这很慢...非常慢。我正在寻找如何使这个更好,更快,更超级的想法。
我使用MS SQL Express 2008的...
我有包含两个字段的表(更多,但不相关)。这些字段是价格和数量。我想找到这张表的几个统计数据,其中中间价格调整为数量。
今天我有一个基本慢的不是好看的函数,它将总数量除以2,然后按照价格排序记录并从总数量中减去数量。当总量达到0时,我有我的中位数。
正如你所猜测的,这很慢...非常慢。我正在寻找如何使这个更好,更快,更超级的想法。
我使用MS SQL Express 2008的...
这至少应该只有两个查询,而不是一个循环做到这一点:
declare @total int
select @total = sum(Quantity) from Products
select top 1 p.Price
from Products p
order by abs((select sum(Quantity) from Products where Price < p.Price) - (@total/2))
为包括外地在价格上与指标数量可能会以奇迹的表现...
我不是靠近我的SQL框来挖掘OVER PARTITION的东西,但利用它应该做你想要的。看看这篇文章的SQL 2005节的例子:link text
这可能是我在过去的使用,而不用景色最好的一个:
SELECT AVG(DISTINCT Quantity)
FROM (SELECT F1.ID, F1.Quantity,
SUM(CASE WHEN F2.Quantity < F1.Quantity THEN 1 ELSE 0 END),
SUM(CASE WHEN F2.Quantity = F1.Quantity THEN 1 ELSE 0 END),
SUM(CASE WHEN F2.Quantity > F1.Quantity THEN 1 ELSE 0 END)
FROM [Table] as F1, [Table] as F2
GROUP BY F1.ID, F1.Quantity) AS Partitions (ID, Quantity, Lesser, Equal, Greater)
WHERE Lesser = Greater
OR (Lesser <= (SELECT COUNT(*) FROM [Table])/2.0 AND Greater <= (SELECT COUNT(*) FROM [Table])/2.0);
被问了几次才 的http:// stackoverflow.com/questions/1342898/function-to-calculate-median-in-sql-server – gbn 2010-02-07 16:32:30
这不仅仅是一个柱子吗?我无法弄清楚这与我的两列问题有何关系。 – rozon 2010-02-07 16:37:28