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.

Utilizando la tabla resultante de INNER JOIN en otro INNER JOIN.

No estoy seguro de que el título realmente corresponda, tal vez mi enfoque esté equivocado.

Tengo la siguiente estructura de base de datos:

TABLA productores
    id

<p>TABLE data
    id
    date 
    value 
    productor_id OneToMany
```</p>

Lo primero que quiero hacer es obtener, para cada productor, la última fecha registrada en los datos. El siguiente código hace exactamente eso:

```postgresql
SELECT productores.id AS id_productor, max.date AS max_fecha
FROM productores
INNER JOIN data ON productores.id = data.productor_id
INNER JOIN (
    SELECT productor_id, MAX(date) AS date
    FROM data
    GROUP BY productor_id
) AS max USING (productor_id, date)

Y la tabla resultante es:

|   id_productor   |             max_fecha           |
|       5         |  2022-01-01 01:45:00.000 +0000 |
|       7         |  2022-01-01 01:45:00.000 +0000 |
|       14        |  2022-01-01 01:45:00.000 +0000 |
|       15        |  2022-01-01 01:45:00.000 +0000 |
|       17        |  2022-01-01 01:45:00.000 +0000 |

Lo siguiente que necesito hacer es sumar todos los registros de datos por productor CON fecha mayor que la max_fecha que obtuvimos para cada productor después de la unión interna de la consulta anterior. La suma se realizará en la columna value.

Espero que eso haya quedado claro, si no, avísame. He intentado realizar otra unión interna y usar la tabla max en la cláusula WHERE, pero obtuve un error que me dijo que la tabla estaba allí, pero no se podía usar en esa parte de la consulta.

Tal vez otra unión interna no sea la solución. Aquí estoy limitado por mi conocimiento de SQL y realmente no sé qué palabras clave leer más a fondo para entender cuál es el mejor enfoque y cómo hacerlo. Por lo tanto, sería realmente útil que me indicaran la mejor manera.

Gracias de antemano.

EDICIÓN: Olvidé especificar en qué columna se ejecutará la SUMA.

EDICIÓN 2: Acabo de darme cuenta de que lo que estoy preguntando aquí, el resultado siempre será una tabla vacía porque nunca habrá un registro cuya fecha sea mayor. Cuando escribí la versión simplificada de mi base de datos, olvidé agregar una tabla/unión, por eso. Pero al final, en mi opinión, el enfoque/solución seguirá siendo el mismo, solo aplicado en una tabla diferente. Lo siento de nuevo por eso.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener la suma de todos los registros de data por productor con una date mayor que la max_date obtenida de la consulta anterior, puedes utilizar una subconsulta en la cláusula SELECT de la consulta original.

    Aquí está la consulta modificada:

    SELECT producers.id AS producer_id, max.date AS max_date, 
        (SELECT SUM(value) FROM data WHERE producer_id = producers.id AND date > max.date) AS total 
    FROM producers
    INNER JOIN data ON producers.id = data.producer_id
    INNER JOIN (
        SELECT producer_id, MAX(date) AS date
        FROM data
        GROUP BY producer_id
    ) AS max USING (producer_id, date)
    

    La subconsulta suma la columna value para cada productor donde el producer_id coincide con el productor actual en la consulta externa y la date es mayor que la max_date para ese productor.

    La tabla resultante tendrá tres columnas: producer_id, max_date y total, que es la suma de value para todos los registros relevantes de data.

    Ten en cuenta que en tu caso, la subconsulta siempre devolverá cero filas porque ningún registro de data puede tener una date mayor que la max_date para ese productor. Sin embargo, si agregas otra tabla o unión que potencialmente pueda tener registros más nuevos, la consulta seguirá funcionando correctamente.

Comments are closed.