es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo obtener el número de días consecutivos a partir de la fecha actual utilizando postgres?

Quiero obtener el número de días consecutivos desde la fecha actual utilizando Postgres SQL.

Arriba se muestra el escenario en el que he resaltado que el recuento de días consecutivos debería ser así.

A continuación se muestra la consulta SQL que he creado, pero no está devolviendo el resultado esperado.

with grouped_dates as (
  select user_id, created_at::timestamp::date, 
         (created_at::timestamp::date - (row_number() over (partition by user_id order by created_at::timestamp::date)::text || ' días')::interval)::date as grouping_date
  from watch_history
)
select * , dense_rank() over (partition by grouping_date order by created_at::timestamp::date) as in_streak
from grouped_dates where user_id = 702
order by created_at::timestamp::date

¿Alguien podría ayudarme a resolver este problema?

Si de alguna manera podemos aplicar distinct a la columna created_at en la siguiente consulta, entonces obtendré soluciones para mi problema.

WITH list AS
(
SELECT user_id,
  (created_at::timestamp::date - (row_number() over (partition by user_id order by created_at::timestamp::date)::text || ' días')::interval)::date as next_day
  FROM watch_history
)
SELECT user_id, count(*) AS number_of_consecutive_days
  FROM list
 WHERE next_day IS NOT NULL
 GROUP BY user_id

¿Alguien tiene alguna idea de cómo aplicar distinct a created_at en la consulta mencionada anteriormente?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para obtener el número de días consecutivos a partir de la fecha actual en PostgreSQL, puedes utilizar la siguiente consulta SQL:

    WITH current_date AS (
      SELECT NOW()::timestamp::date as current_date
    ),
    ordered_dates as (
      SELECT user_id, created_at::timestamp::date
      FROM watch_history
      WHERE user_id = 702 -- reemplazar con el ID de usuario deseado
      ORDER BY created_at::timestamp::date DESC
    ),
    grouped_dates as (
      SELECT user_id, created_at::timestamp::date, 
             date_trunc('day', (current_date.current_date - created_at::timestamp::date)) as diff
      FROM ordered_dates, current_date
      WHERE created_at::timestamp::date <= current_date.current_date
    ),
    consecutive_days as (
      SELECT user_id, created_at::timestamp::date, 
             count(*) OVER (PARTITION BY user_id, diff ORDER BY created_at::timestamp::date DESC) as streak
      FROM grouped_dates
    )
    SELECT user_id, max(streak) as number_of_consecutive_days
    FROM consecutive_days
    GROUP BY user_id
    

    Esta consulta primero obtiene la fecha actual y ordena las fechas en orden descendente para el usuario seleccionado. Luego, agrupa las fechas según la diferencia en días entre la fecha actual y la fecha en la tabla. Finalmente, utiliza la función de ventana count(*) OVER para obtener la racha de días consecutivos para cada fecha y usuario. Se selecciona la racha máxima para cada usuario como el número total de días consecutivos.

    Nota: Reemplaza el 702 en la consulta SQL con el ID de usuario deseado.

Comments are closed.