Referencia DDSQL

Disponible para:

Editor DDSQL | Notebooks

Información general

DDSQL es SQL para datos de Datadog. Implementa varias operaciones SQL estándar, como SELECT, y permite realizar consultas de datos no estructurados. Puedes realizar acciones, como obtener exactamente los datos que buscas, escribiendo tu propia sentencia SELECT, o consultar etiquetas (tags) como si fueran columnas de tablas estándar.

Esta documentación cubre el soporte SQL disponible e incluye:

Celda de Workspace de ejemplo con sintaxis de SQL

Sintaxis

Se admite la siguiente sintaxis de SQL:

SELECT (DISTINCT) (DISTINCT: Opcional)
Recupera filas de una base de datos, con DISTINCT filtrando los registros duplicados.
SELECT DISTINCT customer_id
FROM orders 
JOIN
Combina filas de dos o más tablas basándose en una columna relacionada entre ellas. Admite FULL JOIN, INNER JOIN, LEFT JOIN, RIGHT JOIN.
SELECT orders.order_id, customers.customer_name
FROM orders
JOIN customers
ON orders.customer_id = customers.customer_id 
GROUP BY
Agrupa las filas que tienen los mismos valores en las columnas especificadas en filas de resumen.
SELECT product_id, SUM(quantity)
FROM sales
GROUP BY product_id 
|| (concat)
Concatena dos o más cadenas.
SELECT first_name || ' ' || last_name AS full_name
FROM employees 
WHERE (Incluye compatibilidad con los filtros LIKE, IN, ON, OR)
Filtra los registros que cumplen una condición especificada.
SELECT *
FROM employees
WHERE department = 'Sales' AND name LIKE 'J%' 
CASE
Proporciona una lógica condicional para devolver diferentes valores basados en condiciones especificadas.
SELECT order_id,
  CASE
    WHEN quantity > 10 THEN 'Bulk Order'
    ELSE 'Standard Order'
  END AS order_type
FROM orders 
WINDOW
Realiza un cálculo a través de un conjunto de filas de tabla relacionadas con la fila actual.
SELECT
  timestamp,
  service_name,
  cpu_usage_percent,
  AVG(cpu_usage_percent) OVER (PARTITION BY service_name ORDER BY timestamp ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg_cpu
FROM
  cpu_usage_data 
IS NULL/IS NOT NULL
Comprueba si un valor es nulo o no.
SELECT *
FROM orders
WHERE delivery_date IS NULL 
LIMIT
Especifica el número máximo de registros a devolver.
SELECT *
FROM customers
LIMIT 10 
OFFSET
Omite un número especificado de registros antes de empezar a devolver registros de la consulta.
SELECT *
FROM employees
OFFSET 20 
ORDER BY
Ordena el conjunto de resultados de una consulta por una o varias columnas. Incluye ASC, DESC para el orden de clasificación.
SELECT *
FROM sales
ORDER BY sale_date DESC 
HAVING
Filtra los registros que cumplen una condición especificada después de la agrupación.
SELECT product_id, SUM(quantity)
FROM sales
GROUP BY product_id
HAVING SUM(quantity) > 10 
IN, ON, OR
Se utilizan para especificar condiciones en las consultas. Disponible en las cláusulas WHERE, JOIN.
SELECT *
FROM orders
WHERE order_status IN ('Shipped', 'Pending') 
USING
Esta cláusula es una abreviatura para uniones en las que las columnas unidas tienen el mismo nombre en ambas tablas. Toma una lista separada por comas de esas columnas y crea una condición de igualdad independiente para cada par coincidente. Por ejemplo, unir T1 y T2 con USING (a, b) equivale a ON T1.a = T2.a AND T1.b = T2.b.
SELECT orders.order_id, customers.customer_name
FROM orders
JOIN customers
USING (customer_id) 
AS
Renombra una columna o tabla con un alias.
SELECT first_name AS name
FROM employees 
Operaciones aritméticas
Realiza cálculos básicos utilizando operadores como +, -, *, /.
SELECT price, tax, (price * tax) AS total_cost
FROM products 
INTERVAL value unit
Intervalo que representa una duración de tiempo especificada en una unidad determinada. Unidades admitidas:
- milliseconds/millisecond
- seconds/second
- minutes/minute
- hours/hour
- days/day

Tipos de datos

DDSQL admite los siguientes tipos de datos:

Tipo de datosDescripción
BIGINTEnteros con signo de 64 bits.
BOOLEANValores true o false.
DOUBLENúmeros de coma flotante de doble precisión.
INTERVALValores de duración.
JSONDatos JSON.
TIMESTAMPValores de fecha y hora.
VARCHARCadenas de caracteres de longitud variable.

Tipos de matrices

Todos los tipos de datos admiten tipos de matrices. Las matrices pueden contener varios valores del mismo tipo de datos.

Tipos literales

DDSQL admite tipos literales explícitos utilizando la sintaxis [TYPE] [value].

TipoSintaxisEjemplo
BIGINTBIGINT valueBIGINT 1234567
BOOLEANBOOLEAN valueBOOLEAN true
DOUBLEDOUBLE valueDOUBLE 3.14159
INTERVALINTERVAL 'value unit'INTERVAL '30 minutes'
JSONJSON 'value'JSON '{"key": "value", "count": 42}'
TIMESTAMPTIMESTAMP 'value'TIMESTAMP '2023-12-25 10:30:00'
VARCHARVARCHAR 'value'VARCHAR 'hello world'

El prefijo del tipo puede omitirse y el tipo se deduce automáticamente del valor. Por ejemplo, 'hello world' se deduce como VARCHAR, 123 como BIGINT y true como BOOLEAN. Utiliza prefijos de tipo explícitos cuando los valores puedan ser ambiguos. Por ejemplo,TIMESTAMP '2025-01-01' se deduciría como VARCHAR sin el prefijo.

Matrices literales

Las matrices literales utilizan la sintaxis ARRAY[value1, value2, ...]. El tipo de matriz se deduce automáticamente de los valores.

SELECT ARRAY['apple', 'banana', 'cherry'] AS fruits; -- Inferred as VARCHAR array
SELECT ARRAY[1, 2, 3] AS numbers;                    -- Inferred as BIGINT array
SELECT ARRAY[true, false, true] AS flags;            -- Inferred as BOOLEAN array
SELECT ARRAY[1.1, 2.2, 3.3] AS decimals;             -- Inferred as DOUBLE array

Ejemplo

-- Using type literals in queries
SELECT
    VARCHAR 'Product Name: ' || name AS labeled_name,
    price * DOUBLE 1.08 AS price_with_tax,
    created_at + INTERVAL '7 days' AS expiry_date
FROM products
WHERE created_at > TIMESTAMP '2025-01-01';

Funciones

Se admiten las siguientes funciones de SQL. Para la función de ventana, consulta la sección función de ventana de esta documentación.

FunciónTipo de retornoDescripción
MIN(variable v)Variable typeofDevuelve el valor más pequeño de un conjunto de datos.
MAX(variable v)Variable typeofDevuelve el valor máximo de todos los valores de entrada.
COUNT(any a)numéricoDevuelve el número de valores de entrada que no son nulos.
SUM(numeric n)numéricoDevuelve la suma de todos los valores de entrada.
AVG(numeric n)numéricoDevuelve el valor medio (media aritmética) de todos los valores de entrada.
BOOL_AND(boolean b)booleanoDevuelve si todos los valores de entrada no nulos son verdaderos.
BOOL_OR(boolean b)booleanoDevuelve si cualquier valor de entrada no nulo es verdadero.
CEIL(numeric n)numéricoDevuelve el valor redondeado al entero más próximo.
FLOOR(numeric n)numéricoDevuelve el valor redondeado al entero más próximo.
ROUND(numeric n)numéricoDevuelve el valor redondeado al entero más próximo.
POWER(numeric base, numeric exponent)numéricoDevuelve el valor de la base elevado a la potencia del exponente.
LOWER(string s)cadenaDevuelve la cadena en minúsculas.
UPPER(string s)cadenaDevuelve la cadena en mayúsculas.
ABS(numeric n)numéricoDevuelve el valor absoluto.
COALESCE(args a)typeof first non-null a OR nullDevuelve el primer valor no nulo o nulo si todos son nulos.
CAST(value AS type)tipoConvierte el valor dado al tipo de datos especificado.
LENGTH(string s)enteroDevuelve el número de caracteres de la cadena.
TRIM(string s)cadenaElimina los espacios en blanco iniciales y finales de la cadena.
REPLACE(string s, string from, string to)cadenaSustituye las apariciones de una subcadena dentro de una cadena por otra subcadena.
SUBSTRING(string s, int start, int length)cadenaExtrae una subcadena de una cadena, comenzando en una posición dada y para una longitud especificada.
STRPOS(string s, string substring)enteroDevuelve la primera posición del índice de la subcadena en una cadena dada, o 0 si no hay coincidencia.
SPLIT_PART(string s, string delimiter, integer index)cadenaDivide la cadena en el delimitador dado y devuelve la cadena en la posición dada contando desde uno.
EXTRACT(unit from timestamp/interval)numéricoExtrae una parte de un campo de fecha u hora (como el año o el mes) de una marca temporal o intervalo.
TO_TIMESTAMP(string timestamp, string format)marca de tiempoConvierte una cadena en una marca de tiempo según el formato dado.
TO_CHAR(timestamp t, string format)cadenaConvierte una marca de tiempo en una cadena según el formato dado.
DATE_BIN(interval stride, timestamp source, timestamp origin)marca de tiempoAlinea una marca de tiempo (fuente) en buckets de longitud par (stride). Devuelve el inicio del bucket que contiene la fuente, calculado como la mayor marca de tiempo que es menor o igual que la fuente y es un múltiplo de longitudes de stride desde el origen.
DATE_TRUNC(string unit, timestamp t)marca de tiempoTrunca una marca de tiempo a una precisión especificada basada en la unidad proporcionada.
CURRENT_SETTING(string setting_name)cadenaDevuelve el valor actual del parámetro especificado. Admite los parámetros dd.time_frame_start y dd.time_frame_end, que devuelven el inicio y el final del marco temporal global, respectivamente.
NOW()marca de tiempoDevuelve la marca de tiempo actual al inicio de la consulta actual.
CARDINALITY(array a)enteroDevuelve el número de elementos de la matriz.
ARRAY_POSITION(array a, typeof_array value)enteroDevuelve el índice de la primera aparición del valor encontrado en la matriz, o null (nulo) si no se encuentra el valor.
STRING_TO_ARRAY(string s, string delimiter)matriz de cadenasDivide la cadena dada en una matriz de cadenas utilizando el delimitador dado.
ARRAY_AGG(expression e)matriz de tipo de entradaCrea una matriz al recopilar todos los valores de entrada.
UNNEST(array a [, array b...])filas de a [, b…]Expande matrices en un conjunto de filas. Esta forma sólo se permite en una cláusula FROM.

MIN

SELECT MIN(response_time) AS min_response_time
FROM logs
WHERE status_code = 200

MAX

SELECT MAX(response_time) AS max_response_time
FROM logs
WHERE status_code = 200

COUNT

SELECT COUNT(request_id) AS total_requests
FROM logs
WHERE status_code = 200 

SUM

SELECT SUM(bytes_transferred) AS total_bytes
FROM logs
GROUP BY service_name

AVG

SELECT AVG(response_time)
AS avg_response_time
FROM logs
WHERE status_code = 200
GROUP BY service_name

BOOL_AND

SELECT BOOL_AND(status_code = 200) AS all_success
FROM logs

BOOL_OR

SELECT BOOL_OR(status_code = 200) AS some_success
FROM logs

CEIL

SELECT CEIL(price) AS rounded_price
FROM products

FLOOR

SELECT FLOOR(price) AS floored_price
FROM products

ROUND

SELECT ROUND(price) AS rounded_price
FROM products

POWER

SELECT POWER(response_time, 2) AS squared_response_time
FROM logs

LOWER

SELECT LOWER(customer_name) AS lowercase_name
FROM customers

UPPER

SELECT UPPER(customer_name) AS uppercase_name
FROM customers

ABS

SELECT ABS(balance) AS absolute_balance
FROM accounts

COALESCE

SELECT COALESCE(phone_number, email) AS contact_info
FROM users

CAST

Tipos de objetivos de cast admitidos:

  • BIGINT
  • DECIMAL
  • TIMESTAMP
  • VARCHAR
SELECT
  CAST(order_id AS VARCHAR) AS order_id_string,
  'Order-' || CAST(order_id AS VARCHAR) AS order_label
FROM
  orders

LENGTH

SELECT
  customer_name,
  LENGTH(customer_name) AS name_length
FROM
  customers

INTERVAL

SELECT
  TIMESTAMP '2023-10-01 10:00:00' + INTERVAL '30 days' AS future_date,
  INTERVAL '1 MILLISECOND 2 SECONDS 3 MINUTES 4 HOURS 5 DAYS'

TRIM

SELECT
  TRIM(name) AS trimmed_name
FROM
  users

REPLACE

SELECT
  REPLACE(description, 'old', 'new') AS updated_description
FROM
  products

SUBSTRING

SELECT
  SUBSTRING(title, 1, 10) AS short_title
FROM
  books

STRPOS

SELECT
  STRPOS('foobar', 'bar')

SPLIT_PART

SELECT
  SPLIT_PART('aaa-bbb-ccc', '-', 2)

EXTRACT

Unidades de extracción compatibles:

LiteralTipo de entradaDescripción
daytimestamp / intervaldía del mes
dowtimestampdía de la semana 1 (lunes) a 7 (domingo)
doytimestampdía del año (1 - 366)
hourtimestamp / intervalhora del día (0 - 23)
minutetimestamp / intervalminuto de la hora (0 - 59)
secondtimestamp / intervalsegundo del minuto (0 - 59)
weektimestampsemana del año (1 - 53)
monthtimestampmes del año (1 - 12)
quartertimestamptrimestre del año (1 - 4)
yeartimestampaño
timezone_hourtimestamphora del inicio del huso horario
timezone_minutetimestampminuto del inicio del huso horario
SELECT
  EXTRACT(year FROM purchase_date) AS purchase_year
FROM
  sales

TO_TIMESTAMP

Patrones compatibles para el formato fecha/hora:

PatrónDescripción
YYYYaño (4 dígitos)
YYaño (2 dígitos)
MMnúmero de mes (01 - 12)
DDdía del mes (01 - 31)
HH24hora del día (00 - 23)
HH12hora del día (01 - 12)
HHhora del día (01 - 12)
MIminuto (00 - 59)
SSsegundo (00 - 59)
MSmilisegundo (000 - 999)
TZabreviatura del huso horario
OFinicio del huso horario desde UTC
AM / amindicador del meridiano (sin puntos)
PM / pmindicador del meridiano (sin puntos)
SELECT
  TO_TIMESTAMP('25/12/2025 04:23 pm', 'DD/MM/YYYY HH:MI am') AS ts

TO_CHAR

Patrones compatibles para el formato fecha/hora:

PatrónDescripción
YYYYaño (4 dígitos)
YYaño (2 dígitos)
MMnúmero de mes (01 - 12)
DDdía del mes (01 - 31)
HH24hora del día (00 - 23)
HH12hora del día (01 - 12)
HHhora del día (01 - 12)
MIminuto (00 - 59)
SSsegundo (00 - 59)
MSmilisegundo (000 - 999)
TZabreviatura del huso horario
OFinicio del huso horario desde UTC
AM / amindicador del meridiano (sin puntos)
PM / pmindicador del meridiano (sin puntos)
SELECT
  TO_CHAR(order_date, 'MM-DD-YYYY') AS formatted_date
FROM
  orders

DATE_BIN

SELECT DATE_BIN('15 minutes', TIMESTAMP '2025-09-15 12:34:56', TIMESTAMP '2025-01-01')
-- Returns 2025-09-15 12:30:00

SELECT DATE_BIN('1 day', TIMESTAMP '2025-09-15 12:34:56', TIMESTAMP '2025-01-01')
-- Returns 2025-09-15 00:00:00

DATE_TRUNC

Truncamientos admitidos:

  • milliseconds
  • seconds / second
  • minutes / minute
  • hours / hour
  • days / day
  • weeks / week
  • months / month
  • quarters / quarter
  • years / year
SELECT
  DATE_TRUNC('month', event_time) AS month_start
FROM
  events

CURRENT_SETTING

Parámetros de configuración admitidos:

  • dd.time_frame_start: Devuelve el inicio de la marca de tiempo seleccionada en formato RFC 3339 (YYYY-MM-DD HH:mm:ss.sss±HH:mm).
  • dd.time_frame_end: Devuelve el final de la marca de tiempo seleccionada en formato RFC 3339 (YYYY-MM-DD HH:mm:ss.sss±HH:mm).
-- Define the current analysis window
WITH bounds AS (
  SELECT CAST(CURRENT_SETTING('dd.time_frame_start') AS TIMESTAMP) AS time_frame_start,
         CAST(CURRENT_SETTING('dd.time_frame_end')   AS TIMESTAMP) AS time_frame_end
),
-- Define the immediately preceding window of equal length
     previous_bounds AS (
  SELECT time_frame_start - (time_frame_end - time_frame_start) AS prev_time_frame_start,
         time_frame_start                                       AS prev_time_frame_end
  FROM bounds
)
SELECT * FROM bounds, previous_bounds

NOW

SELECT
  *
FROM
  sales
WHERE
  purchase_date > NOW() - INTERVAL '1 hour'

CARDINALITY

SELECT
  CARDINALITY(recipients)
FROM
  emails

ARRAY_POSITION

SELECT
  ARRAY_POSITION(recipients, 'hello@example.com')
FROM
  emails

STRING_TO_ARRAY

SELECT
  STRING_TO_ARRAY('a,b,c,d,e,f', ',')

ARRAY_AGG

SELECT
  sender,
  ARRAY_AGG(subject) subjects,
  ARRAY_AGG(ALL subject) all_subjects,
  ARRAY_AGG(DISTINCT subject) distinct_subjects
FROM
  emails
GROUP BY
  sender

UNNEST

SELECT
  sender,
  recipient
FROM
  emails,
  UNNEST(recipients) AS recipient

Expresiones regulares

Sabor

Todas las funciones de expresión regular (regex) utilizan el formato ICU (International Components for Unicode):

Funciones

FunciónTipo de retornoDescripción
REGEXP_LIKE(string input, string pattern)BooleanoEvalúa si una cadena coincide con un patrón de expresión regular.
REGEXP_MATCH(string input, string pattern [, string flags ])matriz de cadenasDevuelve las subcadenas de la primera coincidencia de patrón en la cadena.

Esta función busca en la cadena de entrada utilizando el patrón dado y devuelve las subcadenas capturadas (grupos de captura) de la primera coincidencia. Si no hay grupos de captura, devuelve la coincidencia completa.
REGEXP_REPLACE(string input, string pattern, string replacement [, string flags ])cadenaSustituye la subcadena que es la primera coincidencia con el patrón, o todas las coincidencias si utilizas el marcador opcional g .
REGEXP_REPLACE (string input, string pattern, string replacement, integer start, integer N [, string flags ] )cadenaSustituye la subcadena que es la enésima coincidencia con el patrón, o todas las coincidencias si N es cero, empezando por start.

REGEXP_LIKE

SELECT
  *
FROM
  emails
WHERE
  REGEXP_LIKE(email_address, '@example\.com$')

REGEXP_MATCH

SELECT regexp_match('foobarbequebaz', '(bar)(beque)');
-- {bar,beque}

SELECT regexp_match('foobarbequebaz', 'barbeque');
-- {barbeque}

SELECT regexp_match('abc123xyz', '([a-z]+)(\d+)(x(.)z)');
-- {abc,123,xyz,y}

REGEXP_REPLACE

SELECT regexp_replace('Auth success token=abc123XYZ789', 'token=\w+', 'token=***');
-- Auth success token=***

SELECT regexp_replace('status=200 method=GET', 'status=(\d+) method=(\w+)', '$2: $1');
-- GET: 200

SELECT regexp_replace('INFO INFO INFO', 'INFO', 'DEBUG', 1, 2);
-- INFO DEBUG INFO

Marcadores de función

Puedes utilizar los siguientes marcadores con funciones de expresión regular:

i
Coincidencia que no distingue mayúsculas y minúsculas
n o m
Coincidencia que reconoce nuevas líneas
g
Global; sustiyuye todas las subcadenas coincidentes en lugar de solo la primera

Marcador i

SELECT regexp_match('INFO', 'info')
-- NULL

SELECT regexp_match('INFO', 'info', 'i')
-- ['INFO']

Marcador n

SELECT regexp_match('a
b', '^b');
-- NULL

SELECT regexp_match('a
b', '^b', 'n');
-- ['b']

Marcador g

SELECT icu_regexp_replace('Request id=12345 completed, id=67890 pending', 'id=\d+', 'id=XXX');
-- Request id=XXX completed, id=67890 pending

SELECT regexp_replace('Request id=12345 completed, id=67890 pending', 'id=\d+', 'id=XXX', 'g');
-- Request id=XXX completed, id=XXX pending

Funciones de ventana

Esta tabla proporciona información general de las funciones de ventana admitidas. Para ver más detalles y ejemplos, consulte la documentación de PostgreSQL.

FunciónTipo de retornoDescripción
OVERN/ADefine una ventana para un conjunto de filas sobre las que pueden operar otras funciones de ventana.
PARTITION BYN/ADivide el conjunto de resultados en particiones, específicamente para aplicar funciones de ventana.
RANK()enteroAsigna un rango a cada fila dentro de una partición, con espacios para los empates.
ROW_NUMBER()enteroAsigna un número secuencial único a cada fila dentro de una partición.
LEAD(column n)columna typeofDevuelve el valor de la siguiente fila de la partición.
LAG(column n)columna typeofDevuelve el valor de la fila anterior de la partición.
FIRST_VALUE(column n)columna typeofDevuelve el primer valor de un conjunto ordenado de valores.
LAST_VALUE(column n)columna typeofDevuelve el último valor de un conjunto ordenado de valores.
NTH_VALUE(column n, offset)columna typeofDevuelve el valor en el desplazamiento especificado en un conjunto ordenado de valores.

Funciones y operadores JSON

NombreTipo de devoluciónDescripción
json_extract_path_text(text json, text path…)textoExtrae un subobjeto JSON como texto, definido por la ruta. Su comportamiento es equivalente a la función Postgres del mismo nombre. Por ejemplo, json_extract_path_text(col, ‘forest') devuelve el valor de la clave forest para cada objeto JSON en col. Consulta el ejemplo siguiente para ver la sintaxis de una matriz JSON.
json_extract_path(text json, text path…)JSONMisma funcionalidad que json_extract_path_text, pero devuelve una columna de tipo JSON en lugar de tipo texto.
json_array_elements(text json)filas de JSONExpande una matriz JSON en un conjunto de filas. Esta forma solo se permite en una cláusula FROM.
json_array_elements_text(text json)filas de textoExpande una matriz JSON en un conjunto de filas. Esta forma solo se permite en una cláusula FROM.

Funciones de tabla

Join the Preview!

La consulta de logs y métricas mediante DDSQL está en vista previa. Utiliza este formulario para solicitar accesso.

Request Access

Las funciones de tabla se utilizan para consultar logs y métricas.

FunciónDescripciónEjemplo
dd.logs(
    filter => varchar,
    columns => array < varchar >,
    indexes => array < varchar >,
    from_timestamp => timestamp,
    to_timestamp => timestamp
) AS (column_name type [, ...])
Devuelve los datos de logs en forma de tabla. El parámetro de columna especifica qué campos de log extraer, y la cláusula AS define el esquema de la tabla devuelta. Opcional: Filtrado por índice o rango temporal. Si no se especifica la hora, se utilizará por defecto la última hora de los datos.
SELECT timestamp, host, service, message
FROM dd.logs(
    filter => 'source (fuente):java',
    columns => ARRAY['timestamp','host', 'service','message']
) AS (
    timestamp TIMESTAMP,
    host VARCHAR,
    service VARCHAR,
    message VARCHAR
)
dd.metric_scalar(
    query varchar
    reducer varchar [, from_timestamp timestamp, to_timestamp timestamp]
)
Devuelve datos de métricas como un valor escalar. La función acepta una consulta de métricas (con agrupación opcional), un reductor para determinar cómo se agregan los valores (medio, máx, etc.) y parámetros opcionales de fecha y hora (por defecto 1 hora) para definir el intervalo de tiempo.
SELECT *
FROM dd.metric_scalar(
    'avg:system.cpu.user{*} by {service}',
    'avg',
    TIMESTAMP '2025-07-10 00:00:00.000-04:00',
    TIMESTAMP '2025-07-17 00:00:00.000-04:00'
)
ORDER BY value DESC;

Etiquetas

DDSQL expone etiquetas como un tipo hstore, inspirado en PostgreSQL. Puedes acceder a los valores de determinadas claves de etiqueta utilizando el operador de flecha de PostgreSQL. Por ejemplo:

SELECT instance_type, count(instance_type)
FROM aws.ec2_instance
WHERE tags->'region' = 'us-east-1' -- region is a tag, not a column
GROUP BY instance_type

Las etiquetas son pares clave-valor en los que cada clave puede tener cero, uno o varios valores de etiqueta correspondientes. Cuando se accede al valor de la etiqueta, se devuelve una única cadena que contiene todos los valores correspondientes. Cuando los datos tienen varios valores de etiqueta para la misma clave de etiqueta, se representan como una cadena ordenada y separada por comas. Por ejemplo:

SELECT tags->'team', instance_type, architecture, COUNT(*) as instance_count
FROM aws.ec2_instance
WHERE tags->'team' = 'compute_provisioning,database_ops'
GROUP BY tags->'team', instance_type, architecture
ORDER BY instance_count DESC

También puedes comparar valores de etiquetas como cadenas o conjuntos completos de etiquetas:

SELECT *
FROM k8s.daemonsets da INNER JOIN k8s.deployments de
ON da.tags = de.tags -- for a specific tag: da.tags->'app' = de.tags->'app'

Referencias adicionales

Más enlaces, artículos y documentación útiles: