1

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の中央値を見つけたいと思います。各行の積は次の とおりです。605041561468.8
3628.8 44.8 エントリ の数が偶数であるため、中央値は2つの「中間」エントリ(156と504)の平均、つまり330 です
。選択した時間範囲内の値の中央値であり、ソリューションは私のものではないデータベースを変更できません。同様のクエリを編集して以下に示すクエリを取得しましたが、列名が無効であるため失敗します。助言がありますか?




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)
4

1 に答える 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)

私はこれをテストしていません。

于 2010-10-12T17:55:37.360 に答える