-2

次の表のデータセットでカイ二乗検定を見つけようとしています。私はこのクエリを試してカイ二乗検定を見つけようとしています:

 SELECT sessionnumber, sessioncount, timespent,
 (dim1.cnt * dim2.cnt * dim3.cnt)/(dimall.cnt*dimall.cnt) as expected
 FROM (SELECT sessionnumber, SUM(cast(cnt as bigint)) as cnt
 FROM d3
 GROUP BY sessionnumber) dim1 CROSS JOIN
 (SELECT sessioncount, SUM(cast(cnt as bigint)) as cnt
 FROM d3
 GROUP BY sessioncount) dim2 CROSS JOIN
 (SELECT timespent, SUM(cast(cnt as bigint)) as cnt
 FROM d3
 GROUP BY timespent) dim3 CROSS JOIN
 (SELECT SUM(cast(cnt as bigint)) as cnt FROM d3) dimall

サンプル データは次のとおりです。

sessionnumber   sessioncount    timespent       cnt
1                  17               28          45
2                  22               8           30
3                  1                1           2
4                  1                1           2
5                  8               111          119
6                  8                65          73
7                  11               5           16
8                  1                1           2
9                  62               64          126
10                 6                42          48

しかし、カイ二乗検定値に対して間違った出力が得られます。出力は次のとおりです。

sessionnumber   sessioncount    timespent   expected
1                  23               1          0
2                  23               1          0
3                  23               1          0
4                  23               1          0
5                  23               1          0
6                  23               1          0
7                  23               1          0
8                  23               1          0
9                  23               1          0
10                 23               1          0

私は最善を尽くし、この問題について多くのことを検索しました。私にお願いをして、親切に問題を解決してください!前もって感謝します!

4

2 に答える 2

2

float計算ですでにキャストを行っているため、代わりににキャストすることもできますbigint

 SELECT sessionnumber, sessioncount, timespent,
 (dim1.cnt * dim2.cnt * dim3.cnt)/(dimall.cnt*dimall.cnt) as expected
 FROM (SELECT sessionnumber, SUM(cast(cnt as float)) as cnt
 FROM d3
 GROUP BY sessionnumber) dim1 CROSS JOIN
 (SELECT sessioncount, SUM(cast(cnt as float)) as cnt
 FROM d3
 GROUP BY sessioncount) dim2 CROSS JOIN
 (SELECT timespent, SUM(cast(cnt as float)) as cnt
 FROM d3
 GROUP BY timespent) dim3 CROSS JOIN
 (SELECT SUM(cast(cnt as float)) as cnt FROM d3) dimall;

floatは 16 桁程度の精度を持っているため、既知の宇宙にある合理的な数のオブジェクトをカウントするのに十分なはずです。

于 2013-08-04T13:47:56.547 に答える
2

整数演算、dimal.cnt を 10 進数または数値にキャストするか、次の操作を行います

/(dimall.cnt* 1.00)* (dimall.cnt * 1.00)

実際に何が起こるかを説明する別の例

select 3/2  -- output = 1, integer math, result is an integer

select 3/2.00  -- output = 1.50
于 2013-08-04T13:14:03.077 に答える