anchor.diff:          aggs
           |> List.collect (applyWinAggregation fld win)
           |> Array.ofSeq )
  +  | ExpandBy(fld, aggs) ->
  +      let funcs = aggs |> Seq.map (getExpandAggregationFunction fld) |> Array.ofSeq
  +      objs 
  +      |> Seq.sortBy (pickField fld)
  +      |> Seq.map (fun row ->
  +          funcs |> Array.map (fun f -> f row))
     | GroupBy(flds, aggs) ->
         objs 
         |> Seq.groupBy (fun j -> List.map (fun f -> pickField f j) flds)
  
positive.code:   | WindowAggregation.Mean(fld) -> [ fld, nums fld |> Seq.average |> Number ]
    | WindowAggregation.Min(fld) -> [ fld, nums fld |> Seq.min |> Number ]
    | WindowAggregation.Max(fld) -> [ fld, nums fld |> Seq.max |> Number ]
    | WindowAggregation.FirstKey -> [ "first " + kname, kvalues.[0] ]
    | WindowAggregation.LastKey -> [ "last " + kname, kvalues.[kvalues.Length-1] ]
    | WindowAggregation.MiddleKey -> [ "middle " + kname, kvalues.[(kvalues.Length-1)/2] ]
  
  let compareFields o1 o2 (fld, order) = 
    let reverse = if order = Descending then -1 else 1
  
negative.code:   | Min of string
    | Max of string
    | Mean of string
    | Sum of string
    | FirstKey
    | LastKey
    | MiddleKey
  