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 solo n número de filas en una subconsulta para comparar las columnas obtenidas con una consulta principal (en Oracle SQL)

Quiero buscar la fecha de vencimiento de los últimos tres pagos de facturas y compararla con la fecha de pago, y solo seleccionar aquellos clientes que cumplan con esa condición. Intenté lograr esto de la siguiente manera para el ejemplo, pero no me está dando el resultado deseado.

Quiero verificar las fechas de vencimiento de todas las últimas tres facturas y compararlas con la fecha de pago de todas las últimas tres facturas, por lo que estoy ordenando las filas por la última modificación en una subconsulta e intentando hacerlo solo para las últimas tres por cliente usando rownum >= 3.

Pero el problema es que solo obtengo tres filas, es decir, rownum >= 3 se aplica a toda la consulta y no solo a la interna.

Seleccionar c.cust_node_id
De pago pagar
Unión interna (seleccionar i.payment_due_date como pay_due_date,
cnh.customer_node_id como cust_node_id,
i.invoice_id como inv_id
De factura i
Unión interna con historial de nodos de cliente cnh
en i.customer_node_id = cnh.customer_node_id y
i.current_due = 0 y
rownum >= 3 y
cnh.customer_node_type_id = customer_node_type_id
Ordenar por last_modified) c
en pagar.invoice_id = c.invoice_id y
c.pay_due_date <= pagar.payment_date;

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener la fecha de vencimiento de los últimos tres pagos de facturas y compararla con la fecha de pago, y seleccionar solo a los clientes que cumplan con esa condición, debes aplicar la restricción de “rownum” a la subtarea en lugar de a la tarea principal. Puedes utilizar una subconsulta anidada o una Expresión de Tabla Común (CTE) para lograr esto.

    Aquí tienes un ejemplo utilizando una subconsulta anidada:

    SELECT c.cust_node_id
    FROM payment pay
    INNER JOIN (
      SELECT i.payment_due_date AS pay_due_date,
             cnh.customer_node_id AS cust_node_id
      FROM (
        SELECT invoice_id, payment_due_date, customer_node_id, ROW_NUMBER() OVER (PARTITION BY customer_node_id ORDER BY last_modified DESC) AS rn
        FROM invoice
        WHERE current_due = 0
      ) i
      INNER JOIN customer_node_history cnh
        ON i.customer_node_id = cnh.customer_node_id
        AND cnh.customer_node_type_id = customer_node_type_id
      WHERE i.rn <= 3
    ) c
    ON pay.invoice_id = (
      SELECT invoice_id
      FROM invoice i2
      WHERE i2.customer_node_id = c.cust_node_id
      AND i2.current_due = 0
      ORDER BY i2.last_modified DESC
      FETCH FIRST 1 ROW ONLY
    ) AND c.pay_due_date <= pay.payment_date;
    

    En esta consulta, primero utilizamos una subconsulta para asignar un número de fila a cada factura en función de la fecha de “last_modified”, y filtramos solo aquellos con un número de fila menor o igual a 3. Luego unimos esta subconsulta con la tabla “customer_node_history” para obtener la información del cliente.

    Finalmente, nos unimos con la tabla “payment” utilizando una subconsulta para obtener la factura más reciente de cada cliente (con “current_due = 0”) y comparamos la fecha de pago con la fecha de vencimiento.

    Nota que esta consulta asume que el “invoice_id” es único para cada combinación de factura/cliente. Si este no es el caso, es posible que debas ajustar la subconsulta para incluir otros campos que garanticen la unicidad.

Comments are closed.