Type to search.

ES|QL DEDUP command

Serverless Preview

Elastic Cloud Serverless projects are autoscaled environments, fully managed by Elastic and available on Elastic Cloud.

Availability

  • Preview

    This functionality is in technical preview and is ready for evaluation. Use with caution in production; it is not recommended for mission-critical workloads. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. Specific Support terms apply.

Serverless interfaces and procedures might differ from classic Elastic Stack deployments.

Stack Planned

The Elastic Stack includes Elastic's core products such as Elasticsearch, Kibana, Logstash, and Beats.

Availability

  • Planned

    We plan to add this functionality in a future Elastic Stack update. Subject to changes.

Unless stated otherwise on the page, this functionality is available when your Elastic Stack is deployed on Elastic Cloud Hosted, Elastic Cloud Enterprise, Elastic Cloud on Kubernetes, and self-managed environments.

This documentation corresponds to the latest patch available for each minor version. If you're not using the latest patch, check the release notes for changes.

DEDUP removes duplicate rows from a result set, keeping only one row per unique combination of values across all columns.

ES|QL
DEDUP

DEDUP takes no arguments. It compares all columns currently in scope and discards any row that is an exact duplicate of a previously seen row. Null values are treated as equal for the purpose of deduplication.

DEDUP is equivalent to LIMIT 1 BY <all columns>.

DEDUP always keeps exactly one row per unique combination of all columns in scope. Use LIMIT ... BY directly for the following two cases:

  • Keeping more than one copy of each duplicate. To retain up to N rows per unique combination instead of just one, use LIMIT N BY <all columns>. Note that LIMIT ... BY does not support wildcards, so you must list every column explicitly:

    ES|QL
    FROM employees
    | WHERE emp_no IN (10001, 10003, 10007, 10008, 10010)
    | KEEP languages
    | LIMIT 2 BY languages
    | SORT languages
    
    languages:integer
    2
    2
    4
    4
  • Deduplicating on a subset of the columns. To treat rows as duplicates based on only some of the columns, while still returning the remaining columns, list just those columns in the BY clause. Precede it with a SORT to control which row is kept for each group:

    ES|QL
    FROM employees
    | WHERE emp_no IN (10001, 10002, 10003, 10005, 10006)
    | SORT last_name
    | LIMIT 1 BY gender
    | KEEP first_name, last_name, gender
    
    first_name:keyword last_name:keyword gender:keyword
    Parto Bamford M
    Anneke Preusig F

DEDUP cannot be used when any column in scope has one of the following types: aggregate_metric_double, counter types (counter_long, counter_integer, counter_double), or date_range. Attempting to do so results in a validation error.

Columns of an unsupported type are ignored when comparing rows, and DEDUP does not fail because of them. This includes fields mapped to incompatible types across the indices of a FROM (a union type): such a field is returned as null until it is converted, so it cannot tell rows apart. For example, if emp_no is integer in one index and long in another, FROM employees, employees_incompatible | KEEP emp_no | DEDUP returns a single row. A later conversion such as EVAL e = emp_no::long does not bring the removed rows back. To deduplicate on the value of such a field, convert it first and then DEDUP: EVAL e = emp_no::long | DROP emp_no | DEDUP.

Full-text search functions (such as MATCH or KQL) cannot appear after DEDUP in the same pipeline.

Remove duplicate values from a single column:

ES|QL
FROM employees
| WHERE emp_no IN (10001, 10002, 10003, 10005, 10006)
| KEEP gender
| DEDUP
| SORT gender
gender:keyword
F
M

Remove rows that are duplicates across multiple columns:

ES|QL
FROM employees
| WHERE emp_no IN (10001, 10002, 10010, 10011)
| KEEP gender, languages
| DEDUP
| SORT gender NULLS LAST, languages
gender:keyword languages:integer
F 5
M 2
null 4
null 5