Sesiones orgánicas por día en los últimos 30 días

Permite visualizar el volumen diario de sesiones de tráfico orgánico para detectar tendencias, picos y caídas en los últimos 30 días.

sesiones-organicas-diarias.sql
-- Sesiones orgánicas por día en los últimos 30 días
-- Cada sesión se identifica con user_pseudo_id + ga_session_id
SELECT
  PARSE_DATE('%Y%m%d', event_date) AS fecha,
  COUNT(
    DISTINCT CONCAT(
      user_pseudo_id, '.',
      CAST(
        (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id')
      AS STRING)
    )
  ) AS sesiones
FROM
  `your-project.analytics_XXXXXXXXX.events_*`
WHERE
  _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
    AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
  AND traffic_source.medium = 'organic'
GROUP BY
  fecha
ORDER BY
  fecha ASC

Explicación paso a paso

  • 4 Convierte event_date (formato string YYYYMMDD) a tipo DATE para facilitar la visualización.
  • 5 Cuenta sesiones únicas combinando user_pseudo_id con ga_session_id, ya que ga_session_id solo es único por usuario.
  • 14 Filtra las tablas particionadas por día usando _TABLE_SUFFIX para acotar a los últimos 30 días.
  • 16 Restringe los resultados a sesiones cuyo medio de adquisición del usuario sea orgánico.
  • 19 Ordena cronológicamente para facilitar la lectura de la tendencia.

Ejemplo de resultado esperado

fechasesiones
2026-03-161247
2026-03-171183
2026-03-181356
2026-03-191089
2026-03-201412

Variaciones y adaptaciones

Para ver los últimos 7 días en lugar de 30, cambiar INTERVAL 30 DAY por INTERVAL 7 DAY. Para agrupar por semana en lugar de día, usar DATE_TRUNC(PARSE_DATE('%Y%m%d', event_date), WEEK) AS semana. Para incluir todos los canales y comparar, eliminar el filtro de traffic_source.medium.