anchor.diff:    | Min of string
     | Max of string
     | Mean of string
  +  | Sum of string
     | FirstKey
     | LastKey
     | MiddleKey
  
positive.code:         GroupBy(keys, aggs)
      | "windowby", key::size::ops ->
          let key = trimIdent (key.Substring(3))
          let aggs = ops |> List.skipWhile (fun s -> s.StartsWith "by ") |> List.map (parseOp winNullaryOps winUnaryOps)
          WindowBy(key, int size, aggs)
      | "take", [n] -> Paging [Take (int n)]
      | "skip", [n] -> Paging [Skip (int n)]
      | _ -> failwith "Unsupported transformation"
  
negative.code:         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)
  