Référence DDSQL

Disponible pour:

Éditeur DDSQL | Notebooks

Présentation

DDSQL est un langage SQL pour les données Datadog. Il implémente plusieurs opérations SQL standard, telles que SELECT, et permet d’interroger des données non structurées. Vous pouvez effectuer des actions comme obtenir exactement les données souhaitées en rédigeant votre propre instruction SELECT, ou interroger des tags comme s’ils étaient des colonnes de table standard.

Cette documentation couvre la prise en charge SQL disponible et inclut :

Exemple de cellule d'espace de travail avec syntaxe SQL

Syntaxe

La syntaxe SQL suivante est prise en charge :

SELECT (DISTINCT) (DISTINCT : facultatif)
Récupérer des lignes depuis une base de données, DISTINCT filtrant les enregistrements en double.
SELECT DISTINCT customer_id
FROM orders 
JOIN
Combiner des lignes provenant de deux tables ou plus en fonction d’une colonne liée entre elles. Prend en charge 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
Regrouper les lignes ayant les mêmes valeurs dans les colonnes spécifiées en lignes récapitulatives.
SELECT product_id, SUM(quantity)
FROM sales
GROUP BY product_id 
|| (concaténation)
Concaténer deux chaînes ou plus.
SELECT first_name || ' ' || last_name AS full_name
FROM employees 
WHERE (prend en charge les filtres LIKE, IN, ON, OR)
Filtrer les enregistrements répondant à une condition spécifiée.
SELECT *
FROM employees
WHERE department = 'Sales' AND name LIKE 'J%' 
CASE
Appliquer une logique conditionnelle pour renvoyer différentes valeurs selon des conditions spécifiées.
SELECT order_id,
  CASE
    WHEN quantity > 10 THEN 'Bulk Order'
    ELSE 'Standard Order'
  END AS order_type
FROM orders 
WINDOW
Effectuer un calcul sur un ensemble de lignes de table liées à la ligne courante.
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
Vérifier si une valeur est nulle ou non nulle.
SELECT *
FROM orders
WHERE delivery_date IS NULL 
LIMIT
Spécifier le nombre maximum d’enregistrements à renvoyer.
SELECT *
FROM customers
LIMIT 10 
OFFSET
Ignorer un nombre spécifié d’enregistrements avant de commencer à renvoyer les résultats de la requête.
SELECT *
FROM employees
OFFSET 20 
ORDER BY
Trier le jeu de résultats d’une requête selon une ou plusieurs colonnes. Prend en charge ASC et DESC pour l’ordre de tri.
SELECT *
FROM sales
ORDER BY sale_date DESC 
HAVING
Filtrer les enregistrements répondant à une condition spécifiée après le regroupement.
SELECT product_id, SUM(quantity)
FROM ventes
GROUP BY product_id
HAVING SUM(quantity) > 10 
IN, ON, OR
Utilisés pour les conditions spécifiées dans les requêtes. Disponibles dans les clauses WHERE et JOIN.
SELECT *
FROM orders
WHERE order_status IN ('Shipped', 'Pending') 
USING
Cette clause est un raccourci pour les jointures dont les colonnes de jointure portent le même nom dans les deux tables. Elle prend une liste de ces colonnes séparées par des virgules et crée une condition d’égalité distincte pour chaque paire correspondante. Par exemple, joindre T1 et T2 avec USING (a, b) est équivalent à 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
Renommer une colonne ou une table avec un alias.
SELECT first_name AS name
FROM employees 
Opérations arithmétiques
Effectuer des calculs de base à l’aide d’opérateurs tels que +, -, *, /.
SELECT price, tax, (price * tax) AS total_cost
FROM products 
INTERVAL value unit
Intervalle représentant une durée spécifiée dans une unité donnée. Unités prises en charge :
- milliseconds / millisecond
- seconds / second
- minutes / minute
- hours / hour
- days / day

Types de données

DDSQL prend en charge les types de données suivants :

Type de donnéesDescription
BIGINTEntiers signés sur 64 bits.
BOOLEANValeurs true ou false.
DECIMALNombres à virgule flottante.
INTERVALValeurs de durée.
JSONDonnées JSON.
TIMESTAMPValeurs de date et d’heure.
VARCHARChaînes de caractères de longueur variable.

Types tableau

Tous les types de données prennent en charge les types tableau. Consultez la section Tableaux pour les littéraux de tableau, l’accès aux éléments et les fonctions de tableau.

Littéraux de type

DDSQL prend en charge les littéraux de type explicites avec la syntaxe [TYPE] [valeur].

TypeSyntaxeExemple
BIGINTBIGINT 'valeur'BIGINT '1234567'
BOOLEANBOOLEAN 'valeur'BOOLEAN 'true'
DECIMALDECIMAL 'valeur'DECIMAL '3.14159'
INTERVALINTERVAL 'valeur unité'INTERVAL '30 minutes'
JSONJSON 'valeur'JSON '{"key": "value", "count": 42}'
TIMESTAMPTIMESTAMP 'valeur'TIMESTAMP '2023-12-25 10:30:00'
VARCHARVARCHAR 'valeur'VARCHAR 'hello world'

Le préfixe de type peut être omis et le type est automatiquement déduit de la valeur. Par exemple, 'hello world' est déduit comme VARCHAR, 123 comme BIGINT et true comme BOOLEAN. Utilisez des préfixes de type explicites lorsque les valeurs peuvent être ambiguës ; par exemple, TIMESTAMP '2025-01-01' serait déduit comme VARCHAR sans le préfixe.

Exemple

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

Tableaux

Les tableaux sont des collections ordonnées de valeurs partageant toutes le même type de données. Chaque type de base DDSQL possède un type tableau correspondant.

Littéraux de tableau

Utiliser la syntaxe ARRAY[valeur1, valeur2, ...] pour construire un littéral de tableau. Le type du tableau est automatiquement déduit des valeurs.

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

Accès aux éléments

Accéder aux éléments individuels d’un tableau avec un indice basé sur 1. Accéder à un index hors limites renvoie NULL.

SELECT ARRAY['a', 'b', 'c'][1];   -- Returns 'a'
SELECT ARRAY['a', 'b', 'c'][2];   -- Returns 'b'
SELECT ARRAY['a', 'b', 'c'][10];  -- Returns NULL (out of bounds)

Pour accéder aux éléments d’une colonne de tableau, utiliser la même syntaxe d’indice :

SELECT recipients[1] AS first_recipient
FROM emails

Fonctions de tableau

Les fonctions suivantes opèrent sur des tableaux :

FonctionType renvoyéDescription
CARDINALITY(array a)BIGINTRenvoie le nombre d’éléments dans le tableau.
ARRAY_POSITION(array a, typeof_array value)BIGINTRenvoie l’index basé sur 1 de la première occurrence de value dans le tableau, ou NULL si non trouvé.
STRING_TO_ARRAY(string s, string delimiter)VARCHAR[]Divise une chaîne en un tableau de chaînes selon le délimiteur donné.
ARRAY_TO_STRING(array a, string delimiter)VARCHARJoint les éléments d’un tableau en une chaîne avec le délimiteur donné.
ARRAY_AGG(expression e)tableau du type d’entréeAgrège les valeurs de plusieurs lignes en un tableau.
UNNEST(array a [, array b...])rows of a [, b…]Développe un ou plusieurs tableaux en un ensemble de lignes. Valide uniquement dans une clause FROM.

CARDINALITY

SELECT
  CARDINALITY(recipients) AS recipient_count
FROM
  emails

ARRAY_POSITION

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

STRING_TO_ARRAY

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

ARRAY_TO_STRING

SELECT
  ARRAY_TO_STRING(ARRAY['a', 'b', 'c'], ',') AS joined_string

ARRAY_AGG

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

UNNEST

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

Fonctions

Les fonctions SQL suivantes sont prises en charge. Pour les fonctions de fenêtrage, consultez la section Fonctions de fenêtrage dans cette documentation.

FonctionType renvoyéDescription
MIN(variable v)typeof vRenvoie la plus petite valeur dans un ensemble de données.
MAX(variable v)typeof vRenvoie la valeur maximale parmi toutes les valeurs d’entrée.
COUNT(any a)numériqueRenvoie le nombre de valeurs d’entrée non nulles.
SUM(numeric n)numériqueRenvoie la somme de toutes les valeurs d’entrée.
AVG(numeric n)numériqueRenvoie la valeur moyenne (moyenne arithmétique) de toutes les valeurs d’entrée.
BOOL_AND(boolean b)booléenRenvoie si toutes les valeurs d’entrée non nulles sont vraies.
BOOL_OR(boolean b)booléenRenvoie si au moins une valeur d’entrée non nulle est vraie.
CEIL(numeric n) / CEILING(numeric n)numériqueRenvoie la valeur arrondie à l’entier supérieur. CEIL et CEILING sont tous deux pris en charge comme alias.
FLOOR(numeric n)numériqueRenvoie la valeur arrondie à l’entier inférieur.
ROUND(numeric n)numériqueRenvoie la valeur arrondie à l’entier le plus proche.
POWER(numeric base, numeric exponent)numériqueRenvoie la valeur de la base élevée à la puissance de l’exposant.
LOWER(string s)chaîneRenvoie la chaîne en minuscules.
UPPER(string s)chaîneRenvoie la chaîne en majuscules.
ABS(numeric n)numériqueRenvoie la valeur absolue.
COALESCE(args a)typeof first non-null a OR nullRenvoie la première valeur non nulle, ou null si toutes sont nulles.
CAST(value AS type)typeConvertit la valeur donnée vers le type de données spécifié.
LENGTH(string s)nombre entierRenvoie le nombre de caractères dans la chaîne.
TRIM(string s)chaîneSupprime les espaces blancs en début et en fin de chaîne.
REPLACE(string s, string from, string to)chaîneRemplace les occurrences d’une sous-chaîne dans une chaîne par une autre sous-chaîne.
SUBSTRING(string s, int start, int length)chaîneExtrait une sous-chaîne à partir d’une position donnée et d’une longueur spécifiée.
REVERSE(string s)chaîneRenvoie la chaîne avec les caractères en ordre inverse.
STRPOS(string s, string substring)nombre entierRenvoie la position du premier index de la sous-chaîne dans la chaîne donnée, ou 0 si aucune correspondance.
SPLIT_PART(string s, string delimiter, integer index)chaîneDivise la chaîne selon le délimiteur donné et renvoie la chaîne à la position donnée en comptant à partir de un.
EXTRACT(unit from timestamp/interval)numériqueExtrait une partie d’un champ de date ou d’heure (comme l’année ou le mois) depuis un timestamp ou un intervalle.
TO_TIMESTAMP(string timestamp, string format)timestampConvertit une chaîne en timestamp selon le format donné.
TO_TIMESTAMP(numeric epoch)timestampConvertit un timestamp d’époque UNIX (en secondes) en timestamp.
TO_CHAR(timestamp t, string format)chaîneConvertit un timestamp en chaîne selon le format donné.
DATE_BIN(interval stride, timestamp source, timestamp origin)timestampAligne un timestamp (source) sur des intervalles de longueur régulière (stride). Renvoie le début de l’intervalle contenant la source, calculé comme le plus grand timestamp inférieur ou égal à la source et correspondant à un multiple de longueurs de stride à partir de l’origine.
DATE_TRUNC(string unit, timestamp t)timestampTronque un timestamp à une précision spécifiée selon l’unité fournie.
CURRENT_SETTING(string setting_name)chaîneRenvoie la valeur actuelle du paramètre spécifié. Prend en charge les paramètres dd.time_frame_start et dd.time_frame_end, qui renvoient respectivement le début et la fin de la plage temporelle globale.
NOW()timestampRenvoie le timestamp UTC actuel au début de la requête en cours.
CARDINALITY(array a)nombre entierRenvoie le nombre d’éléments dans le tableau.
ARRAY_POSITION(array a, typeof_array value)nombre entierRenvoie l’index de la première occurrence de la valeur trouvée dans le tableau, ou null si la valeur est introuvable.
STRING_TO_ARRAY(string s, string delimiter)tableau de chaînesDivise la chaîne donnée en un tableau de chaînes à l’aide du délimiteur donné.
ARRAY_TO_STRING(array a, string delimiter)chaîneConvertit un tableau en chaîne en concaténant les éléments avec le délimiteur donné.
ARRAY_AGG(expression e)tableau du type d’entréeCrée un tableau en collectant toutes les valeurs d’entrée.
APPROX_PERCENTILE(double percentile) WITHIN GROUP (ORDER BY expression e)typeof expressionCalcule une valeur de percentile approximative. Le percentile doit être compris entre 0,0 et 1,0 (inclus). Nécessite la syntaxe WITHIN GROUP (ORDER BY ...).
UNNEST(array a [, array b...])lignes de a [, b…]Développe des tableaux en un ensemble de lignes. Cette forme est uniquement autorisée dans une clause 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

Types cibles de conversion pris en charge :

  • 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

REVERSE

SELECT
  REVERSE(username) AS reversed_username
FROM
  users
LIMIT 5

STRPOS

SELECT
  STRPOS('foobar', 'bar')

SPLIT_PART

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

EXTRACT

Unités d’extraction prises en charge :

LittéralType d’entréeDescription
daytimestamp / intervaljour du mois
dowtimestampjour de la semaine 1 (lundi) to 7 (dimanche)
doytimestampjour de l’année (1 - 366)
epochtimestamp / intervalsecondes depuis 1970-01-01 00:00:00 UTC (pour les timestamps), ou nombre total de secondes (pour les intervalles)
hourtimestamp / intervalheure du jour (0 - 23)
minutetimestamp / intervalminute de l’heure (0 - 59)
secondtimestamp / intervalseconde de la minute (0 - 59)
weektimestampsemaine de l’année (1 - 53)
monthtimestampmois de l’année (1 - 12)
quartertimestamptrimestre de l’année (1 - 4)
yeartimestampannée
timezone_hourtimestampheure du décalage de fuseau horaire
timezone_minutetimestampminute du décalage de fuseau horaire
SELECT
  EXTRACT(year FROM purchase_date) AS purchase_year
FROM
  sales
-- Obtenir l'époque Unix d'un timestamp
SELECT EXTRACT(epoch FROM TIMESTAMP '2021-01-01 00:00:00+00')
-- Renvoie : 1609459200
-- Obtenir le nombre total de secondes d'un intervalle
SELECT EXTRACT(epoch FROM INTERVAL '1 day 2 hours')
-- Renvoie : 93600
-- Calculer le nombre de secondes écoulées depuis chaque événement
SELECT
  event_time,
  EXTRACT(epoch FROM now()) - EXTRACT(epoch FROM event_time) AS seconds_ago
FROM
  events

TO_TIMESTAMP

TO_TIMESTAMP existe sous deux formes :

Forme 1 : convertir une chaîne en timestamp avec un format

Modèles pris en charge pour le formatage de date/heure :

ModèleDescription
YYYYannée (4 chiffres)
YYannée (2 chiffres)
MMnuméro du mois (01 - 12)
DDjour du mois (01 - 31)
HH24heure du jour (00 - 23)
HH12heure du jour (01 - 12)
HHheure du jour (01 - 12)
MIminute (00 - 59)
SSseconde (00 - 59)
MSmilliseconde (000 - 999)
TZabréviation du fuseau horaire
OFdécalage du fuseau horaire par rapport à UTC
AM / amindicateur méridien (sans points)
PM / pmindicateur méridien (sans points)
SELECT
  TO_TIMESTAMP('25/12/2025 04:23 pm', 'DD/MM/YYYY HH:MI am') AS ts

Forme 2 : convertir un timestamp d’époque UNIX en timestamp

SELECT
  TO_TIMESTAMP(1735142580) AS ts_from_epoch

TO_CHAR

Modèles pris en charge pour le formatage de date/heure :

ModèleDescription
YYYYannée (4 chiffres)
YYannée (2 chiffres)
MMnuméro du mois (01 - 12)
DDjour du mois (01 - 31)
HH24heure du jour (00 - 23)
HH12heure du jour (01 - 12)
HHheure du jour (01 - 12)
MIminute (00 - 59)
SSseconde (00 - 59)
MSmilliseconde (000 - 999)
TZabréviation du fuseau horaire
OFdécalage du fuseau horaire par rapport à UTC
AM / amindicateur méridien (sans points)
PM / pmindicateur méridien (sans points)
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')
-- Renvoie 2025-09-15 12:30:00

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

DATE_TRUNC

Troncatures prises en charge :

  • 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

Paramètres pris en charge :

  • dd.time_frame_start : renvoie le début de la plage temporelle sélectionnée au format RFC 3339 (YYYY-MM-DD HH:mm:ss.sss±HH:mm).
  • dd.time_frame_end : renvoie la fin de la plage temporelle sélectionnée au format 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'

APPROX_PERCENTILE

-- Calculer le temps de réponse médian (50e percentile)
SELECT
  APPROX_PERCENTILE(0.5) WITHIN GROUP (ORDER BY response_time) AS median_response_time
FROM
  logs

-- Calculer les percentiles de temps de réponse au 95e et 99e par service
SELECT
  service_name,
  APPROX_PERCENTILE(0.95) WITHIN GROUP (ORDER BY response_time) AS p95_response_time,
  APPROX_PERCENTILE(0.99) WITHIN GROUP (ORDER BY response_time) AS p99_response_time
FROM
  logs
GROUP BY
  service_name

Expressions régulières

Version

Toutes les fonctions d’expression régulière (regex) utilisent la version International Components for Unicode (ICU) :

Fonctions

FonctionType renvoyéDescription
REGEXP_LIKE(string input, string pattern)BooléenÉvalue si une chaîne correspond à un modèle d’expression régulière.
REGEXP_MATCH(string input, string pattern [, string flags ])tableau de chaînesRenvoie les sous-chaînes de la première correspondance du modèle dans la chaîne.

Cette fonction recherche dans la chaîne d’entrée à l’aide du modèle donné et renvoie les sous-chaînes capturées (groupes de capture) de la première correspondance. Si aucun groupe de capture n’est présent, renvoie la correspondance complète.
REGEXP_REPLACE(string input, string pattern, string replacement [, string flags ])chaîneRemplace la sous-chaîne correspondant à la première occurrence du modèle, ou toutes les occurrences si l’indicateur g facultatif est utilisé.
REGEXP_REPLACE (string input, string pattern, string replacement, integer start, integer N [, string flags ] )chaîneRemplace la sous-chaîne correspondant à la Nième occurrence du modèle, ou toutes les occurrences si N vaut zéro, en commençant à partir de 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

Indicateurs au niveau de la fonction

Les indicateurs suivants peuvent être utilisés avec les fonctions d’expression régulière :

i
Correspondance insensible à la casse
n or m
Correspondance sensible aux sauts de ligne
g
Global ; remplacer toutes les sous-chaînes correspondantes plutôt que la première uniquement

Indicateur i

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

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

Indicateur n

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

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

Indicateur 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

Fonctions de fenêtrage

Ce tableau présente un aperçu des fonctions de fenêtrage prises en charge. Pour des informations détaillées et des exemples, consultez la documentation PostgreSQL.

FonctionType renvoyéDescription
OVERS. O.Définit une fenêtre pour un ensemble de lignes sur lesquelles d’autres fonctions de fenêtrage opèrent.
PARTITION BYS. O.Divise le jeu de résultats en partitions, spécifiquement pour l’application des fonctions de fenêtrage.
RANK()nombre entierAttribue un rang à chaque ligne dans une partition, avec des écarts pour les ex-aequo.
ROW_NUMBER()nombre entierAttribue un numéro séquentiel unique à chaque ligne dans une partition.
LEAD(column n)typeof columnRenvoie la valeur de la ligne suivante dans la partition.
LAG(column n)typeof columnRenvoie la valeur de la ligne précédente dans la partition.
FIRST_VALUE(column n)typeof columnRenvoie la première valeur d’un ensemble de valeurs ordonné.
LAST_VALUE(column n)typeof columnRenvoie la valeur à l’offset spécifié dans un ensemble de valeurs ordonné.
NTH_VALUE(column n, offset)typeof columnRenvoie la valeur à l’offset spécifié dans un ensemble de valeurs ordonné.

Fonctions et opérateurs JSON

NameType renvoyéDescription
json_extract_path_text(text json, text path…)texteExtrait un sous-objet JSON sous forme de texte, défini par le chemin. Son comportement est équivalent à la fonction Postgres du même nom. Par exemple, json_extract_path_text(col, 'forest') renvoie la valeur de la clé forest pour chaque objet JSON dans col. Consultez l’exemple ci-dessous pour la syntaxe des tableaux JSON.
json_extract_path(text json, text path…)JSONMême fonctionnalité que json_extract_path_text, mais renvoie une colonne de type JSON au lieu du type texte.
json_array_elements(text json)lignes de JSONDéveloppe un tableau JSON en un ensemble de lignes. Cette forme est uniquement autorisée dans une clause FROM.
json_array_elements_text(text json)lignes de texteDéveloppe un tableau JSON en un ensemble de lignes. Cette forme est uniquement autorisée dans une clause FROM.

Fonctions de table

Les fonctions de table permettent d’interroger les logs, les métriques et d’autres sources de données non structurées.

FunctionDescriptionExample
dd.logs(
    columns => array < varchar >,
    filter ? => varchar,
    indexes ? => array < varchar >,
    storage ? => varchar,
    from_timestamp ? => timestamp,
    to_timestamp ? => timestamp
) AS (column_name type [, ...])
Renvoie les données de log sous forme de table. Le paramètre columns spécifie les champs de log à extraire. Les champs imbriqués sont accessibles avec la notation par points, et les champs non principaux doivent être précédés de @. La clause AS définit le schéma de la table renvoyée. Facultatif : filtrage par index ou plage temporelle. Lorsque la plage temporelle n'est pas spécifiée, DDSQL utilise par défaut le paramètre de plage temporelle global, qui dans DDSQL Editor correspond à la dernière heure. Facultatif : spécification du stockage à utiliser (par exemple, hot, flex_tier). Lorsqu'il n'est pas spécifié, le stockage chaud est utilisé par défaut.
SELECT timestamp, host, service, message, asset_id
FROM dd.logs(
    filter  => 'source:java',
    columns => ARRAY['timestamp','host','service','message','@asset.id']
) AS (
    timestamp TIMESTAMP,
    host      VARCHAR,
    service   VARCHAR,
    message   VARCHAR,
    asset_id  VARCHAR
)
dd.metrics_scalar(
    query varchar,
    reducer varchar [, from_timestamp timestamp, to_timestamp timestamp]
)
Renvoie les données de métrique sous forme de valeur scalaire. La fonction accepte une requête de métriques (avec regroupement facultatif), un reducer pour déterminer la méthode d'agrégation des valeurs (avg, max, etc.) et des paramètres de timestamp facultatifs (1 heure par défaut) pour définir la plage temporelle.
SELECT *
FROM dd.metrics_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;
dd.metrics_timeseries(
    query varchar [, from_timestamp timestamp, to_timestamp timestamp]
)
Renvoie les données de métrique sous forme de série temporelle. La fonction accepte une requête de métriques (avec regroupement facultatif) et des paramètres de timestamp facultatifs (1 heure par défaut) pour définir la plage temporelle. Renvoie des points de données dans le temps plutôt qu'une valeur agrégée unique.
SELECT *
FROM dd.metrics_timeseries(
    'avg:system.cpu.user{*} by {service}',
    TIMESTAMP '2025-07-10 00:00:00.000-04:00',
    TIMESTAMP '2025-07-17 00:00:00.000-04:00'
)
ORDER BY timestamp, service;

Timestamps absolus

SELECT *
FROM dd.logs(
    columns => ARRAY['timestamp','host','service','message'],
    from_timestamp => TIMESTAMP '2025-07-10 00:00:00.000-04:00',
    to_timestamp => TIMESTAMP '2025-07-17 00:00:00.000-04:00'
) AS (
    timestamp TIMESTAMP,
    host      VARCHAR,
    service   VARCHAR,
    message   VARCHAR
)

Timestamps relatifs

SELECT *
FROM dd.logs(
    columns => ARRAY['timestamp','host','service','message'],
    from_timestamp => now() - INTERVAL '7 days',
    to_timestamp => now()
) AS (
    timestamp TIMESTAMP,
    host      VARCHAR,
    service   VARCHAR,
    message   VARCHAR
)

Paramètres facultatifs

SELECT *
FROM dd.logs(
    columns => ARRAY['timestamp','host','service','message'],
    filter  => 'source:java',
    indexes => ARRAY['trino'],
    storage => 'hot'
) AS (
    timestamp TIMESTAMP,
    host      VARCHAR,
    service   VARCHAR,
    message   VARCHAR
)

Accès aux champs imbriqués

Les alias de colonnes ne peuvent pas contenir de points ; remplacez-les par des underscores ou tout autre caractère valide lors de la définition de l’alias.

SELECT timestamp, host, asset_id, view_url, data_resource_type
FROM dd.logs(
    filter  => 'service:mcp',
    columns => ARRAY['timestamp','host','@asset.id','@view.url','@data.resource.type']
) AS (
    timestamp TIMESTAMP,
    host      VARCHAR,
    asset_id  VARCHAR,
    view_url  VARCHAR,
    data_resource_type VARCHAR
)

Tags

DDSQL expose les tags sous forme de type hstore, inspiré de PostgreSQL. Vous pouvez accéder aux valeurs de clés de tags spécifiques à l’aide de l’opérateur flèche de PostgreSQL. Par exemple :

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

Les tags sont des paires clé-valeur où chaque clé peut avoir zéro, une ou plusieurs valeurs de tag correspondantes. Lors de l’accès, la valeur du tag renvoie une chaîne unique contenant toutes les valeurs correspondantes. Lorsque les données comportent plusieurs valeurs de tag pour la même clé de tag, elles sont représentées sous forme de chaîne triée et séparée par des virgules. Par exemple :

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

Vous pouvez également comparer des valeurs de tags sous forme de chaînes ou des ensembles de tags entiers :

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'

De plus, vous pouvez extraire les clés et les valeurs des tags dans des tableaux de texte individuels :

SELECT akeys(tags), avals(tags)
FROM aws.ec2_instance

Fonctions et opérateurs HSTORE

NameType renvoyéDescription
tags -> ’text'TexteObtient la valeur pour une clé donnée. Renvoie null si la clé est absente.
akeys(hstore tags)Tableau de texteObtient les clés d’un HSTORE sous forme de tableau
avals(hstore tags)Tableau de texteObtient les valeurs d’un HSTORE sous forme de tableau

Pour aller plus loin

Documentation, liens et articles supplémentaires utiles: