Skip to content

Commit d1c4874

Browse files
author
James Cor
committed
implment std samp
1 parent 48b1214 commit d1c4874

File tree

7 files changed

+270
-51
lines changed

7 files changed

+270
-51
lines changed

enginetest/queries/script_queries.go

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -7898,9 +7898,9 @@ where
78987898
},
78997899
Assertions: []ScriptTestAssertion{
79007900
{
7901-
Query: "select std(i), stddev(i), stddev_pop(i) from t;",
7901+
Query: "select std(i), stddev(i), stddev_pop(i), stddev_samp(i) from t;",
79027902
Expected: []sql.Row{
7903-
{nil, nil, nil},
7903+
{nil, nil, nil, nil},
79047904
},
79057905
},
79067906
{
@@ -7910,9 +7910,9 @@ where
79107910
},
79117911
},
79127912
{
7913-
Query: "select std(i), stddev(i), stddev_pop(i) from t;",
7913+
Query: "select std(i), stddev(i), stddev_pop(i), stddev_samp(i) from t;",
79147914
Expected: []sql.Row{
7915-
{0.0, 0.0, 0.0},
7915+
{0.0, 0.0, 0.0, nil},
79167916
},
79177917
},
79187918
{
@@ -7922,9 +7922,9 @@ where
79227922
},
79237923
},
79247924
{
7925-
Query: "select std(i), stddev(i), stddev_pop(i) from t;",
7925+
Query: "select std(i), stddev(i), stddev_pop(i), stddev_samp(i) from t;",
79267926
Expected: []sql.Row{
7927-
{0.5, 0.5, 0.5},
7927+
{0.5, 0.5, 0.5, 0.7071067811865476},
79287928
},
79297929
},
79307930
{
@@ -7934,9 +7934,9 @@ where
79347934
},
79357935
},
79367936
{
7937-
Query: "select std(i), stddev(i), stddev_pop(i) from t;",
7937+
Query: "select std(i), stddev(i), stddev_pop(i), stddev_samp(i) from t;",
79387938
Expected: []sql.Row{
7939-
{0.816496580927726, 0.816496580927726, 0.816496580927726},
7939+
{0.816496580927726, 0.816496580927726, 0.816496580927726, 1.0},
79407940
},
79417941
},
79427942
{
@@ -7946,38 +7946,38 @@ where
79467946
},
79477947
},
79487948
{
7949-
Query: "select std(i), stddev(i), stddev_pop(i) from t;",
7949+
Query: "select std(i), stddev(i), stddev_pop(i), stddev_samp(i) from t;",
79507950
Expected: []sql.Row{
7951-
{0.816496580927726, 0.816496580927726, 0.816496580927726},
7951+
{0.816496580927726, 0.816496580927726, 0.816496580927726, 1.0},
79527952
},
79537953
},
79547954
{
7955-
Query: "select i, std(j) from tt group by i;",
7955+
Query: "select i, std(j), stddev_samp(j) from tt group by i;",
79567956
Expected: []sql.Row{
7957-
{0, 0.816496580927726},
7958-
{1, 271.89336144893275},
7957+
{0, 0.816496580927726, 1.0},
7958+
{1, 271.89336144893275, 333.0},
79597959
},
79607960
},
79617961
{
7962-
Query: "select std(i) over(), std(j) over() from tt order by i;",
7962+
Query: "select std(i) over(), std(j) over(), stddev_samp(j) over() from tt order by i;",
79637963
Expected: []sql.Row{
7964-
{0.5, 297.47660972475353},
7965-
{0.5, 297.47660972475353},
7966-
{0.5, 297.47660972475353},
7967-
{0.5, 297.47660972475353},
7968-
{0.5, 297.47660972475353},
7969-
{0.5, 297.47660972475353},
7964+
{0.5, 297.47660972475353, 325.86929895281634},
7965+
{0.5, 297.47660972475353, 325.86929895281634},
7966+
{0.5, 297.47660972475353, 325.86929895281634},
7967+
{0.5, 297.47660972475353, 325.86929895281634},
7968+
{0.5, 297.47660972475353, 325.86929895281634},
7969+
{0.5, 297.47660972475353, 325.86929895281634},
79707970
},
79717971
},
79727972
{
7973-
Query: "select i, std(j) over(partition by i) from tt order by i;",
7973+
Query: "select i, std(j) over(partition by i), stddev_samp(j) over(partition by i) from tt order by i;",
79747974
Expected: []sql.Row{
7975-
{0, 0.816496580927726},
7976-
{0, 0.816496580927726},
7977-
{0, 0.816496580927726},
7978-
{1, 271.89336144893275},
7979-
{1, 271.89336144893275},
7980-
{1, 271.89336144893275},
7975+
{0, 0.816496580927726, 1.0},
7976+
{0, 0.816496580927726, 1.0},
7977+
{0, 0.816496580927726, 1.0},
7978+
{1, 271.89336144893275, 333.0},
7979+
{1, 271.89336144893275, 333.0},
7980+
{1, 271.89336144893275, 333.0},
79817981
},
79827982
},
79837983
{
@@ -7987,27 +7987,27 @@ where
79877987
},
79887988
},
79897989
{
7990-
Query: "select std(i) over(), std(j) over() from tt order by i;",
7990+
Query: "select std(i) over(), std(j) over(), stddev_samp(j) over() from tt order by i;",
79917991
Expected: []sql.Row{
7992-
{0.5, 297.47660972475353},
7993-
{0.5, 297.47660972475353},
7994-
{0.5, 297.47660972475353},
7995-
{0.5, 297.47660972475353},
7996-
{0.5, 297.47660972475353},
7997-
{0.5, 297.47660972475353},
7998-
{0.5, 297.47660972475353},
7992+
{0.5, 297.47660972475353, 325.86929895281634},
7993+
{0.5, 297.47660972475353, 325.86929895281634},
7994+
{0.5, 297.47660972475353, 325.86929895281634},
7995+
{0.5, 297.47660972475353, 325.86929895281634},
7996+
{0.5, 297.47660972475353, 325.86929895281634},
7997+
{0.5, 297.47660972475353, 325.86929895281634},
7998+
{0.5, 297.47660972475353, 325.86929895281634},
79997999
},
80008000
},
80018001
{
8002-
Query: "select i, std(j) over(partition by i) from tt order by i;",
8002+
Query: "select i, std(j) over(partition by i), stddev_samp(j) over(partition by i) from tt order by i;",
80038003
Expected: []sql.Row{
8004-
{nil, nil},
8005-
{0, 0.816496580927726},
8006-
{0, 0.816496580927726},
8007-
{0, 0.816496580927726},
8008-
{1, 271.89336144893275},
8009-
{1, 271.89336144893275},
8010-
{1, 271.89336144893275},
8004+
{nil, nil, nil},
8005+
{0, 0.816496580927726, 1.0},
8006+
{0, 0.816496580927726, 1.0},
8007+
{0, 0.816496580927726, 1.0},
8008+
{1, 271.89336144893275, 333.0},
8009+
{1, 271.89336144893275, 333.0},
8010+
{1, 271.89336144893275, 333.0},
80118011
},
80128012
},
80138013
},

optgen/cmd/source/unary_aggs.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,6 @@ unaryAggs:
3333
desc: "returns the sum of expr in all rows"
3434
nullable: false
3535
- name: "StdDevPop"
36-
desc: "returns the population standard deviation of expr"
36+
desc: "returns the population standard deviation of expr"
37+
- name: "StdDevSamp"
38+
desc: "returns the sample standard deviation of expr"

sql/expression/function/aggregation/unary_agg_buffers.go

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ type stdDevPopBuffer struct {
672672
vals []interface{}
673673
expr sql.Expression
674674

675-
count int64
675+
count uint64
676676
oldMean float64
677677
newMean float64
678678
oldVar float64
@@ -728,4 +728,65 @@ func (s *stdDevPopBuffer) Eval(ctx *sql.Context) (interface{}, error) {
728728

729729
// Dispose implements the Disposable interface.
730730
func (s *stdDevPopBuffer) Dispose() {
731-
}
731+
}
732+
733+
type stdDevSampBuffer struct {
734+
vals []interface{}
735+
expr sql.Expression
736+
737+
count uint64
738+
oldMean float64
739+
newMean float64
740+
oldVar float64
741+
newVar float64
742+
}
743+
744+
func NewStdDevSampBuffer(child sql.Expression) *stdDevSampBuffer {
745+
return &stdDevSampBuffer{
746+
vals: nil,
747+
expr: child,
748+
}
749+
}
750+
751+
// Update implements the AggregationBuffer interface.
752+
func (s *stdDevSampBuffer) Update(ctx *sql.Context, row sql.Row) error {
753+
v, err := s.expr.Eval(ctx, row)
754+
if err != nil {
755+
return err
756+
}
757+
758+
v, _, err = types.Float64.Convert(ctx, v)
759+
if err != nil {
760+
v = 0.0
761+
ctx.Warn(1292, "Truncated incorrect DOUBLE value: %s", v)
762+
}
763+
if v == nil {
764+
return nil
765+
}
766+
val := v.(float64)
767+
768+
s.count += 1
769+
if s.count == 1 {
770+
s.oldMean = val
771+
s.newMean = val
772+
return nil
773+
}
774+
775+
s.newMean = s.oldMean + (val - s.oldMean) / float64(s.count)
776+
s.newVar = s.oldVar + (val - s.oldMean) * (val - s.newMean)
777+
s.oldVar = s.newVar
778+
s.oldMean = s.newMean
779+
780+
return nil
781+
}
782+
783+
// Eval implements the AggregationBuffer interface.
784+
func (s *stdDevSampBuffer) Eval(ctx *sql.Context) (interface{}, error) {
785+
if s.count <= 1 {
786+
return nil, nil
787+
}
788+
return math.Sqrt(s.newVar / float64(s.count - 1)), nil
789+
}
790+
791+
// Dispose implements the Disposable interface.
792+
func (s *stdDevSampBuffer) Dispose() {}

sql/expression/function/aggregation/unary_aggs.og.go

Lines changed: 83 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)