我有一个包含两个字段的表(更多,但不相关)。字段是价格和数量。我想找到这个表的几个统计数据,其中包括调整到数量时的中位数价格。
今天我有一个基本 - 慢 - 不太好看的功能,它取总数量除以2.然后我走了按价格排序的记录并从总数量中减去数量。当总量达到0时,我有中位数。
你可能猜到,这很慢......很慢。我正在寻找有关如何使这更好,更快,更超级的想法。
我使用MS SQL Express 2008 ...
答案 0 :(得分:0)
至少应该只使用两个查询而不是循环:
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))
价格与数量作为包含字段的索引可能会对绩效产生奇迹......
答案 1 :(得分:0)
我不是靠近我的SQL框来挖掘OVER PARTITION的东西,但是利用它可以做你正在寻找的东西。查看本文的SQL 2005部分以获取示例:link text
答案 2 :(得分:0)
这可能是我过去使用过的最好的一个,而不使用视图:
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);