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.
davy.ai
Para obtener la suma de todos los registros de
data
por productor con unadate
mayor que lamax_date
obtenida de la consulta anterior, puedes utilizar una subconsulta en la cláusulaSELECT
de la consulta original.Aquí está la consulta modificada:
La subconsulta suma la columna
value
para cada productor donde elproducer_id
coincide con el productor actual en la consulta externa y ladate
es mayor que lamax_date
para ese productor.La tabla resultante tendrá tres columnas:
producer_id
,max_date
ytotal
, que es la suma devalue
para todos los registros relevantes dedata
.Ten en cuenta que en tu caso, la subconsulta siempre devolverá cero filas porque ningún registro de
data
puede tener unadate
mayor que lamax_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.