Skip to content

Grouping and Aggregating

Grouping records by key

Group records according to a property.

jq

echo '[{"category":"A","value":10},{"category":"B","value":20},{"category":"A","value":5}]' |
jq 'group_by(.category)'

JFTL

TBD

Output

[
  [
    { "category": "A", "value": 10 },
    { "category": "A", "value": 5 }
  ],
  [
    { "category": "B", "value": 20 }
  ]
]

Complete JFTL example

TBD

Aggregating grouped values

Group records and calculate a sum for each group.

jq

echo '[{"category":"A","value":10},{"category":"B","value":20},{"category":"A","value":5}]' |
jq 'group_by(.category) | map({category: .[0].category, sum: (map(.value) | add)})'

JFTL

TBD

Output

[
  { "category": "A", "sum": 15 },
  { "category": "B", "sum": 20 }
]

Complete JFTL example

TBD

Filtering after aggregating

Aggregate groups and keep only groups whose aggregate matches a condition.

jq

echo '[{"category":"A","value":10},{"category":"B","value":20},{"category":"A","value":5}]' |
jq 'group_by(.category) | map({category: .[0].category, sum: (map(.value) | add)}) | map(select(.sum > 17))'

JFTL

TBD

Output

[
  { "category": "B", "sum": 20 }
]

Complete JFTL example

TBD

Custom aggregations

Use an accumulator to calculate a value across a list of records.

jq

echo '[{"value":10},{"value":20},{"value":30}]' |
jq 'reduce .[] as $item (0; . + $item.value)'

JFTL

{
  "$": true,
  "set": { "total": 0 },
  "foreach": {
    "in": "$",
    "update": { "total": "$py=total + _['value']" }
  },
  "out": "$total"
}

Output

60

Complete JFTL example

{
  "main": { "$": true, "data": "$_datasets.input", "out":
      {
        "$": true,
        "set": { "total": 0 },
        "foreach": {
          "in": "$",
          "update": { "total": "$py=total + _['value']" }
        },
        "out": "$total"
      }
  },
  "datasets": {
    "input": [
          { "value": 10 },
          { "value": 20 },
          { "value": 30 }
        ]
  }
}