1

float 値で満たされたテーブルがあります。平均値 (ガウス分布) の周りの分布によってグループ化された結果の数を計算する必要があります。基本的には、次のように計算されます。

SELECT COUNT(*), FloatColumn - AVG(FloatColumn) - STDEV(FloatColumn) 
FROM Data 
GROUP BY FloatColumn - AVG(FloatColumn) - STDEV(FloatColumn)

ただし、明らかな理由により、SQL Server は次のエラーを返します。Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause.

私の質問は、どうにかしてこの計算を SQL Server に任せることができますか? それとも、昔ながらの方法でやらなければなりませんか?すべてのデータを取得し、自分で計算しますか?

4

2 に答える 2

2

OVERセット全体の集計を取得するには、空の句を使用できます

WITH T(Result)
     AS (SELECT FloatColumn - Avg(FloatColumn) OVER() - Stdev(FloatColumn) OVER ()
         FROM   Data)
SELECT Count(*),
       Result
FROM   T
GROUP  BY Result 
于 2012-12-11T08:33:30.750 に答える
1

SQL フィドル

データの事前集計を実行し、テーブルに結合することができます。

スキーマのセットアップ:

create table data(floatcolumn float);
insert data values
  (1234.56),
  (134.56),
  (134.56),
  (234.56),
  (1349),
  (900);

クエリ 1 :

SELECT COUNT(*) C, D.FloatColumn - A
  FROM
    (
    SELECT AVG(FloatColumn) + STDEV(FloatColumn) A
        FROM Data
    ) preagg
CROSS JOIN Data D
GROUP BY FloatColumn - A;

結果

| C |           COLUMN_1 |
--------------------------
| 2 | -1196.876067819572 |
| 1 | -1096.876067819572 |
| 1 |  -431.436067819572 |
| 1 |   -96.876067819572 |
| 1 |    17.563932180428 |
于 2012-12-11T08:37:05.960 に答える