Subqueries#

For a general overview of this endpoint, see the Endpoint Overview page.

Subqueries are a powerful feature of modern SQL. The query endpoint can support subqueries via the "subquery" field in the request body. The format of "subquery" is exactly the same as the full request body and can even support recursive subqueries! Here are some helpful examples that show how to use them.

Concise queries with subqueries#

Sometimes you may have a calculation that needs to be aggregated in multiple ways. One option would be to repeat the calculation in each aggregation’s select, but that can lead to lots of repeated JSON. Subqueries can be used to reduce duplicated expressions. In this example, we use a subquery to square the property Home_Value, then aggregate with min, max, and avg without repeating the calculation.

{
  "select": [
    {
      "function": "max",
      "alias": "max",
      "parameters": {
        "property": {
          "alias_ref": "hv_squared"
        }
      }
    },
    {
      "function": "min",
      "alias": "min",
      "parameters": {
        "property": {
          "alias_ref": "hv_squared"
        }
      }
    },
    {
      "function": "avg",
      "alias": "avg",
      "parameters": {
        "property": {
          "alias_ref": "hv_squared"
        }
      }
    }
  ],
  "subquery": {
    "select": [
      {
        "function": "multiply",
        "alias": "hv_squared",
        "parameters": {
          "left": "Home_Value",
          "right": "Home_Value"
        }
      }
    ]
  }
}

This example returns:

{
    "query_result": [
        {
            "avg": 33413668226.974968,
            "max": 17640000000000,
            "min": 0
        }
    ]
}

Subqueries for grouping#

Subqueries can also be used to perform operations on grouped data. In this example, we get the count of the inferences in each batch in the subquery, then average those counts.

{
    "select": [
        {
            "function": "avg",
            "alias": "avg_count",
            "parameters": {
                "property": {
                    "alias_ref": "batch_count"
                }
            }
        },
        {
            "function": "count",
            "alias": "total_batches"
        }
    ],
    "subquery": {
        "select": [
            {
                "function": "count",
                "alias": "batch_count"
            },
            {
                "property": "batch_id"
            }
        ],
        "group_by": [
            {
                "property": "batch_id"
            }
        ]
    }
}

This query returns:

{
    "query_result": [
        {
            "avg_count": 5930.2558139534885,
            "total_batches": 86
        }
    ]
}