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.

Únete en la fecha más reciente y por partición.

Tengo dos tablas,
clicks:

user date
a 01/10/2021
a 02/10/2021
a 03/10/2021
b 27/09/2021
c 08/10/2021
c 13/10/2021

y segment:

user date segment
a 26/09/2021 1
a 27/09/2021 1
a 03/10/2021 2
c 01/10/2021 5
c 10/10/2021 6

Quiero unir segmento a clics para identificar el segmento más reciente por usuario en esa fecha de clic determinada. Entonces, la salida correcta se verá así:

user date segment
a 01/10/2021 1
a 02/10/2021 1
a 03/10/2021 2
b 27/09/2021
c 08/10/2021 5
c 13/10/2021 6

He intentado lo siguiente pero obtengo el error ‘este tipo de patrón de subconsulta correlacionado no es compatible debido a un error interno’.

select *,
   (select top 1 segment
    from b
    where
          b.date <= a.date
    ORDER BY ROW_NUMBER() OVER(PARTITION BY b.id ORDER BY b.date DESC)) as segment_lookup
from a;

Cualquier ayuda será muy apreciada para encontrar el mejor método. Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución a este problema es utilizar una subconsulta para identificar primero el segmento más reciente para cada combinación de usuario y fecha en la tabla de segmentos. Luego, podemos unir esta subconsulta con la tabla de clics según el usuario y la fecha para obtener el resultado deseado. Aquí está el código SQL para esta solución:

    SELECT clicks.user, clicks.date, segment.segment
    FROM clicks
    LEFT JOIN (
        SELECT user, date, MAX(segment) AS segment
        FROM segment
        GROUP BY user, date
    ) AS segment
    ON clicks.user = segment.user AND clicks.date = segment.date;
    

    Explicación:

    • Primero, creamos una subconsulta que agrupa la tabla de segmentos por usuario y fecha, y selecciona el segmento máximo para cada grupo utilizando la función MAX().
    • Luego, unimos esta subconsulta con la tabla de clics utilizando LEFT JOIN, que conserva todas las filas en la tabla de clics incluso si no hay una fila coincidente en la tabla de segmentos.
    • La cláusula ON de la unión coincide las filas en la tabla de clics con las filas en la subconsulta de segmentos basándose en el usuario y la fecha.
    • Finalmente, seleccionamos las columnas de usuario, fecha y segmento de ambas tablas en el resultado.

    Ten en cuenta que en el caso en que no haya un segmento coincidente para una combinación de usuario y fecha en la tabla de segmentos, la columna de segmento será NULL en el resultado.

Comments are closed.