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 seleccionar las primeras 5 fechas de cada grupo y colocarlas en una sola columna separadas por coma en Oracle?

Tengo una tabla como esta:

División Región Fecha de última visita
1 2 20/11/2021
1 2 18/11/2021
1 7 18/10/2021
1 7 19/11/2021
2 2 17/11/2021
2 3 20/09/2021
2 3 20/10/2021

Quiero escribir una consulta que agrupe por las columnas de división y región y me dé las últimas 5 fechas para cada grupo separadas por comas en una sola columna. Algo así:

División Región Fecha de última visita Hoy Días desde la última visita
1 2 20/11/2021, 18/11/2021 sysdate sysdate – max(fecha de última visita)
1 7 18/10/2021, 19/11/2021 sysdate sysdate – max(fecha de última visita)
2 2 17/11/2021 sysdate sysdate – max(fecha de última visita)
2 3 20/09/2021, 20/10/2021 sysdate sysdate – max(fecha de última visita)

Las últimas dos columnas son columnas calculadas personalizadas que también necesito para la tabla de salida final. Cualquier ayuda sería muy apreciada ya que he intentado muchas cosas, pero sigo recibiendo errores sobre no estar agrupado correctamente, posiblemente debido a las dos columnas adicionales al final. Pero incluso sin eso, no estoy seguro de cómo obtener solo las últimas 5 fechas por grupo en Oracle.

¡Gracias!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr la salida deseada, puede utilizar la función analítica ROW_NUMBER () para asignar un número de fila a cada registro dentro de su grupo basándose en la fecha de la última visita, y luego seleccionar solo las 5 filas principales para cada grupo. Aquí hay una consulta de ejemplo que debería funcionar:

    SELECT
      División,
      Región,
      LISTAGG(Fecha_de última_Visita, ', ') WITHIN GROUP(ORDER BY Fecha_de_Última_Visita DESC) AS "Fecha de la última visita",
      SYSDATE AS Hoy,
      SYSDATE - MAX(Fecha_de_Última_Visita) AS "Días desde la última visita"
    FROM(
      SELECT
        División,
        Región,
        Fecha_de_Última_Visita,
        ROW_NUMBER() OVER(PARTITION BY División, Región ORDER BY Fecha_de_Última_Visita DESC) AS rn
      FROM my_table
    )
    WHERE rn <= 5
    GROUP BY División, Región
    ORDER BY División, Región
    

    En esta consulta, primero seleccionamos las columnas de División, Región y Fecha_de_Última_Visita de la tabla y asignamos un número de fila a cada registro dentro de su grupo utilizando la función ROW_NUMBER(). Luego filtramos las filas para seleccionar solo las 5 filas principales para cada grupo utilizando la cláusula WHERE.

    La consulta externa agrupa las filas restantes por División y Región y utiliza la función LISTAGG () para concatenar los valores de Fecha de la última visita en una lista separada por comas. Finalmente, agregamos las columnas Hoy y Días desde la última visita utilizando la función SYSDATE y restando el valor máximo de Fecha_de_Ultima_Visita para cada grupo.

    ¡Espero que esto ayude! Háganos saber si tiene alguna otra pregunta.

Comments are closed.