【问题标题】:Taking median of calculation in SQL Server在 SQL Server 中取计算中位数
【发布时间】:2010-10-12 17:48:08
【问题描述】:

SQL Server 中的MyTable 包含_TimeStamp、Column1、Column2 和Column3,它们的值如下:

_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*Column1*Column2*Column3 的 median 值。每行的产品是:
60
504
156
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)

【问题讨论】:

    标签: sql-server median


    【解决方案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)
    

    不过我还没有测试过。

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 2015-11-14
      • 2017-06-07
      • 2015-02-10
      相关资源
      最近更新 更多