2010-10-12 86 views
1

的MyTable在SQL Server包含_TimeStamp,列1,列2和栏3,它有以下值:以计算平均在SQL Server

_TimeStamp Column1 Column2 Column3 
'2010-10-11 15:55:25.40' 10 3 0.5 
'2010-10-11 15:55:25.50' 20 9 0.7 
'2010-10-11 15:55:25.60' 15 2 1.3 
'2010-10-11 15:55:25.70' 17 8 2.7 
'2010-10-11 15:55:25.80' 42 6 3.6 
'2010-10-11 15:55:25.90' 14 2 0.4 

我想找到4 *列1的median值*列2 *栏3。该产品为每一行是:
1468.8
3628.8
44.8
由于有偶数个条目,则中值是两个“中间”项的平均值( 156和504)或330.另外,我只想执行落在选定时间范围内的值的中位数,并且解决方案不能更改不属于我的数据库。我编辑了一个similar query以获得如下所示的查询,但因列名无效而失败。有什么建议么?

SELECT 
    AVG(4*Column1*Column2*Column3) 
    FROM 
(
    SELECT 
    4*Column1*Column2*Column3, 
    ROW_NUMBER() OVER (
    ORDER BY 4*Column1*Column2*Column3 ASC, _TimeStamp ASC) AS RowAsc, 
    ROW_NUMBER() OVER (
    ORDER BY 4*Column1*Column2*Column3 DESC, _TimeStamp DESC) AS RowDesc 
    FROM MyTable WHERE 
    _TimeStamp BETWEEN '2010-10-11 15:55:25.40' AND '2010-10-11 15:55:25.90' 

) x 
WHERE 
    RowAsc IN (RowDesc, RowDesc - 1, RowDesc + 1) 

回答

1

我认为,所有你需要做的,你的候选语句在子查询别名计算的值,然后索要AVG该别名在外部查询:

SELECT 
    AVG(MyValue) 
    FROM 
(
    SELECT 
    4*Column1*Column2*Column3 AS MyValue, 
    ROW_NUMBER() OVER (
    ORDER BY 4*Column1*Column2*Column3 ASC, _TimeStamp ASC) AS RowAsc, 
    ROW_NUMBER() OVER (
    ORDER BY 4*Column1*Column2*Column3 DESC, _TimeStamp DESC) AS RowDesc 
    FROM MyTable WHERE 
    _TimeStamp BETWEEN '2010-10-11 15:55:25.40' AND '2010-10-11 15:55:25.90' 

) x 
WHERE 
    RowAsc IN (RowDesc, RowDesc - 1, RowDesc + 1) 

我还没有测试过。

+0

工作很好!谢谢! – KAE 2010-10-12 18:01:42