@@ -1397,6 +1397,43 @@ t_stree::update_agg_table(
13971397 if (!skip)
13981398 dst->set_scalar (dst_ridx, new_value);
13991399 } break ;
1400+ case AGGTYPE_VARIANCE:
1401+ case AGGTYPE_STANDARD_DEVIATION: {
1402+ old_value.set (dst->get_scalar (dst_ridx));
1403+
1404+ auto pkeys = get_pkeys (nidx);
1405+ std::vector<double > values;
1406+
1407+ read_column_from_gstate (
1408+ gstate, expression_master_table, spec.get_dependencies ()[0 ].name (), pkeys, values, false );
1409+
1410+ // Calculate the count, rolling mean, and sum of squares of
1411+ // differences from the current mean at each iteration.
1412+ double count = 0 , mean = 0 , m2 = 0 ;
1413+
1414+ for (double num : values) {
1415+ count++;
1416+ double next_mean = mean + (num - mean) / count;
1417+ m2 += (num - mean) * (num - next_mean);
1418+ mean = next_mean;
1419+ }
1420+
1421+ // Only calculate stddev for more than 1 element in the group.
1422+ if (count >= 2 ) {
1423+ double value = m2 / count;
1424+
1425+ if (spec.agg () == AGGTYPE_STANDARD_DEVIATION) {
1426+ value = std::sqrt (value);
1427+ }
1428+
1429+ new_value.set (value);
1430+ dst->set_scalar (dst_ridx, new_value);
1431+ dst->set_valid (dst_ridx, true );
1432+ } else {
1433+ dst->set_valid (dst_ridx, false );
1434+ }
1435+
1436+ } break ;
14001437 default : { PSP_COMPLAIN_AND_ABORT (" Not implemented" ); }
14011438 } // end switch
14021439
0 commit comments