Aller au contenu principal

Générateur de requêtes SQL

Open in QuickMonitoring→ Sites → [Votre site] → Analytics → SQL

Exécutez des requêtes SQL brutes sur vos données analytiques. Accès complet aux événements, sessions, propriétés utilisateurs et pages vues — sans limites sur ce que vous pouvez analyser.

Ce que vous verrez​

L'interface SQL est composée de trois zones :

Éditeur de requête​

Un éditeur de code avec coloration syntaxique SQL, complétion automatique des noms de tables et de colonnes, et numérotation des lignes. Vous pouvez écrire des requêtes SELECT complexes avec des jointures, des agrégations, des fonctions de fenêtrage et des filtres sur n'importe quelle colonne.

Explorateur de schéma​

Un panneau latéral liste toutes les tables disponibles et leurs colonnes avec les types de données. Cliquez sur un nom de table pour insérer automatiquement un SELECT * FROM table LIMIT 10 dans l'éditeur — pratique pour explorer la structure des données.

Résultats​

Les résultats s'affichent dans un tableau paginé sous l'éditeur. Vous pouvez :

  • Trier par n'importe quelle colonne en cliquant sur l'en-tête
  • Exporter les résultats en CSV
  • Basculer vers une visualisation graphique (histogramme ou courbe) si la requête retourne des données temporelles

Schéma des tables disponibles​

events​

Table principale contenant tous les événements collectés.

ColonneTypeDescription
idUUIDIdentifiant unique de l'événement
site_idUUIDIdentifiant du site
session_idUUIDIdentifiant de la session
user_idTEXTIdentifiant utilisateur (si identify() appelé)
event_nameTEXTNom de l'événement (ex. : pageview, button_click)
propertiesJSONBPropriétés de l'événement
urlTEXTURL de la page au moment de l'événement
referrerTEXTURL référente
timestampTIMESTAMPTZHorodatage UTC de l'événement
device_typeTEXTdesktop, tablet, mobile
browserTEXTNom du navigateur
countryTEXTCode pays ISO 3166-1
osTEXTSystème d'exploitation

sessions​

Une ligne par session utilisateur.

ColonneTypeDescription
idUUIDIdentifiant de la session
site_idUUIDIdentifiant du site
user_idTEXTIdentifiant utilisateur (si identifié)
started_atTIMESTAMPTZDébut de la session
ended_atTIMESTAMPTZFin de la session (null si en cours)
duration_secondsINTEGERDurée totale de la session
pageview_countINTEGERNombre de pages vues
entry_urlTEXTPremière URL visitée
exit_urlTEXTDernière URL visitée
utm_sourceTEXTParamètre UTM source
utm_mediumTEXTParamètre UTM medium
utm_campaignTEXTParamètre UTM campaign

users​

Profils utilisateurs identifiés via QMTracker.identify().

ColonneTypeDescription
idTEXTIdentifiant utilisateur (votre ID)
site_idUUIDIdentifiant du site
propertiesJSONBPropriétés définies via identify()
first_seen_atTIMESTAMPTZPremière apparition dans le système
last_seen_atTIMESTAMPTZDernière activité
session_countINTEGERNombre total de sessions
event_countINTEGERNombre total d'événements

pageviews​

Vue dénormalisée des événements de type pageview pour des requêtes simplifiées.

ColonneTypeDescription
idUUIDIdentifiant de l'événement
session_idUUIDIdentifiant de la session
urlTEXTURL visitée
titleTEXTTitre de la page
timestampTIMESTAMPTZHorodatage
duration_secondsINTEGERTemps passé sur la page

Comment l'utiliser​

Exemples de requêtes courantes​

Pages les plus visitées sur les 30 derniers jours :

SELECT
url,
COUNT(*) AS pageviews,
COUNT(DISTINCT session_id) AS unique_sessions
FROM pageviews
WHERE timestamp >= NOW() - INTERVAL '30 days'
AND site_id = 'YOUR_SITE_ID'
GROUP BY url
ORDER BY pageviews DESC
LIMIT 20;

Événements personnalisés par jour :

SELECT
DATE_TRUNC('day', timestamp) AS day,
event_name,
COUNT(*) AS count
FROM events
WHERE event_name != 'pageview'
AND timestamp >= NOW() - INTERVAL '7 days'
AND site_id = 'YOUR_SITE_ID'
GROUP BY day, event_name
ORDER BY day DESC, count DESC;

Taux de conversion d'un entonnoir personnalisé :

WITH funnel AS (
SELECT
session_id,
MAX(CASE WHEN event_name = 'page_view' AND url LIKE '%/tarifs%' THEN 1 ELSE 0 END) AS step1,
MAX(CASE WHEN event_name = 'signup_started' THEN 1 ELSE 0 END) AS step2,
MAX(CASE WHEN event_name = 'signup_completed' THEN 1 ELSE 0 END) AS step3
FROM events
WHERE timestamp >= NOW() - INTERVAL '30 days'
AND site_id = 'YOUR_SITE_ID'
GROUP BY session_id
)
SELECT
COUNT(*) FILTER (WHERE step1 = 1) AS visited_pricing,
COUNT(*) FILTER (WHERE step2 = 1) AS started_signup,
COUNT(*) FILTER (WHERE step3 = 1) AS completed_signup,
ROUND(100.0 * COUNT(*) FILTER (WHERE step3 = 1) / NULLIF(COUNT(*) FILTER (WHERE step1 = 1), 0), 2) AS conversion_rate
FROM funnel;

Revenus par source UTM :

SELECT
s.utm_source,
s.utm_campaign,
COUNT(DISTINCT e.session_id) AS purchases,
SUM((e.properties->>'revenue')::NUMERIC) AS total_revenue
FROM events e
JOIN sessions s ON e.session_id = s.id
WHERE e.event_name = 'purchase'
AND e.timestamp >= NOW() - INTERVAL '30 days'
AND e.site_id = 'YOUR_SITE_ID'
GROUP BY s.utm_source, s.utm_campaign
ORDER BY total_revenue DESC;

Sauvegarder et partager une requête​

  1. Écrivez et testez votre requête.
  2. Cliquez sur Sauvegarder — donnez un nom et une description optionnelle.
  3. La requête sauvegardée apparaît dans la liste Mes requêtes à gauche.
  4. Cliquez sur Partager pour générer un lien de lecture seule utilisable dans un tableau de bord personnalisé.

Créer une visualisation depuis SQL​

Après exécution d'une requête retournant une colonne de dates et une colonne numérique, cliquez sur Visualiser pour basculer vers un graphique. Sélectionnez :

  • Courbe — pour des séries temporelles
  • Barres — pour des comparaisons de catégories
  • Secteurs — pour des répartitions proportionnelles

Condition de validation​

Cet achievement est débloqué lorsque : vous avez exécuté au moins une requête SQL qui retourne des résultats non vides, et sauvegardé cette requête dans votre liste de requêtes.

Problèmes courants​

Erreur « permission denied » sur certaines tables Les requêtes SQL dans QuickMonitoring sont limitées aux données de votre propre site (filtrées automatiquement par site_id). Vous ne pouvez pas accéder aux données d'autres sites. Les requêtes qui tentent de contourner ce filtre sont rejetées.

Les requêtes sont lentes sur de grandes périodes Pour des analyses sur plusieurs mois, ajoutez toujours un filtre sur timestamp pour limiter le volume scanné. Les tables sont partitionnées par date — un filtre timestamp >= ... permet au moteur d'ignorer les partitions non pertinentes et d'accélérer considérablement la requête.

Les propriétés JSONB ne sont pas accessibles Pour accéder aux champs d'une colonne JSONB, utilisez la syntaxe PostgreSQL :

-- Accéder à une propriété string
properties->>'revenue'

-- Accéder à une propriété numérique avec cast
(properties->>'revenue')::NUMERIC

-- Filtrer sur une propriété
WHERE properties->>'plan' = 'pro'

Résultats tronqués à 1 000 lignes Par mesure de performance, les résultats sont limités à 1 000 lignes dans l'interface. Utilisez LIMIT et OFFSET pour paginer, ou exportez en CSV pour obtenir l'intégralité des données sans limite.