# `QuackDB.Ecto.Analytics`
[🔗](https://github.com/elixir-vibe/quackdb/blob/main/lib/quack_db/ecto/analytics.ex#L2)

DuckDB analytical expression helpers for Ecto queries.

These macros wrap DuckDB-specific SQL functions in `Ecto.Query.API.fragment/1`
so analytical queries can stay in Ecto's query DSL instead of scattering raw
fragment strings across application code.

    import Ecto.Query
    import QuackDB.Ecto.Analytics

    from(event in "events",
      group_by: event.category,
      select: %{
        category: event.category,
        median_score: median(event.score),
        p95_score: quantile_cont(event.score, 0.95),
        scores: list(event.score)
      }
    )

Helpers only build expressions. DuckDB clauses that are not representable in
Ecto's AST, such as `PIVOT`, `UNPIVOT`, `QUALIFY`, and `GROUPING SETS`,
should still be sent as raw SQL.

# `any_value`
*macro* 

# `approx_count_distinct`
*macro* 

# `approx_quantile`
*macro* 

# `approx_top_k`
*macro* 

# `arg_max`
*macro* 

# `arg_max`
*macro* 

# `arg_min`
*macro* 

# `arg_min`
*macro* 

# `band`
*macro* 

# `bitstring_agg`
*macro* 

# `bitstring_agg`
*macro* 

# `bool_and`
*macro* 

# `bool_or`
*macro* 

# `bor`
*macro* 

# `bxor`
*macro* 

# `corr`
*macro* 

# `covar_pop`
*macro* 

# `covar_samp`
*macro* 

# `date_part`
*macro* 

# `date_trunc`
*macro* 

# `entropy`
*macro* 

# `equi_width_bins`
*macro* 

# `favg`
*macro* 

# `fsum`
*macro* 

# `geometric_mean`
*macro* 

# `histogram`
*macro* 

# `histogram_exact`
*macro* 

# `json_contains`
*macro* 

# `json_exists`
*macro* 

# `json_extract`
*macro* 

# `json_extract_string`
*macro* 

# `json_insert`
*macro* 

Builds `json_insert(json, path, value)`, which only adds a missing value.

# `json_remove`
*macro* 

Builds `json_remove(json, path)`.

# `json_replace`
*macro* 

Builds `json_replace(json, path, value)`, which only changes an existing value.

# `json_set`
*macro* 

Builds DuckDB 2.0's `json_set(json, path, value)`, which creates or
replaces the value at `path`. The value is converted with `to_json`, so
Elixir strings set JSON strings. Paths are JSON path strings or lists such
as `[:address, :city]`.

# `kurtosis`
*macro* 

# `kurtosis_pop`
*macro* 

# `list`
*macro* 

# `list`
*macro* 

# `mad`
*macro* 

# `median`
*macro* 

# `mode`
*macro* 

# `product`
*macro* 

# `quantile_cont`
*macro* 

# `quantile_disc`
*macro* 

# `regr_count`
*macro* 

# `regr_intercept`
*macro* 

# `regr_r2`
*macro* 

# `regr_slope`
*macro* 

# `regr_sxx`
*macro* 

# `regr_sxy`
*macro* 

# `regr_syy`
*macro* 

# `reservoir_quantile`
*macro* 

# `reservoir_quantile`
*macro* 

# `sem`
*macro* 

# `skewness`
*macro* 

# `stddev`
*macro* 

# `stddev_pop`
*macro* 

# `string_agg`
*macro* 

# `string_agg`
*macro* 

# `summarize`

Runs DuckDB `SUMMARIZE` for an Ecto queryable using the `:all` query operation.

# `summarize`

Runs DuckDB `SUMMARIZE` for an Ecto queryable using the given Ecto SQL operation.

# `summarize`

# `summarize!`

Runs DuckDB `SUMMARIZE` for an Ecto queryable and raises on error.

# `summarize!`

Runs DuckDB `SUMMARIZE` for an Ecto queryable using the given Ecto SQL operation and raises on error.

# `summarize!`

# `time_bucket`
*macro* 

# `time_bucket`
*macro* 

# `var_pop`
*macro* 

# `var_samp`
*macro* 

# `variable`
*macro* 

Reads a DuckDB variable set with `SET VARIABLE`, using DuckDB 2.0's
`$name` shorthand. Pass a pinned value to read a variable named at runtime
through `getvariable/1`.

# `variance`
*macro* 

# `weighted_avg`
*macro* 

---

*Consult [api-reference.md](api-reference.md) for complete listing*
