MS Access: consulta agrupada basada en el campo MAX

3

Estoy tratando de construir una consulta SQL que tome los siguientes datos:

+-------------+--------+---------+---------+--------+
| Primary Key |   ID   | Version |  Class  | Fruit? |
+-------------+--------+---------+---------+--------+
|           1 | Banana |       1 | NORTH   | Yes    |
|           2 | Onion  |       1 | WEST    | No     |
|           3 | Orange |       1 | NA      | Yes    |
|           4 | Orange |       2 | PACIFIC | Yes    |
|           5 | Banana |       2 | EUR     | Yes    |
|           6 | Celery |       1 | EUR     | No     |
|           7 | Celery |       3 | SOUTH   | No     |
|           8 | Celery |       4 | SOUTH   | No     |
|           9 | Pepper |       1 | N-PAC   | No     |
|          10 | Pepper |       2 | N-PAX   | No     |
+-------------+--------+---------+---------+--------+

Y devuelve la identificación de la última versión y sus datos correspondientes, donde Fruitse examina el criterio de .

Se necesitaría una cadena SQL para devolver la ID con la clase para la versión Max donde Fruit = No

Resultados:

+--------+-------+
|   ID   | Class |
+--------+-------+
| Onion  | NORTH |
| Celery | SOUTH |
| Pepper | N-PAX |
+--------+-------+

Solo necesito devolver el ID y es clase almacenar en un cuadro de lista de MS Access.

Logré construir una consulta Agrupar por / Max en el editor y solo pude obtener las ID para regresar agrupadas, pero los datos correspondientes no estaban asociados con la versión máxima.

Gracias por su ayuda y experiencia.

ExcelMania
fuente

Respuestas:

0

Hay varias formas de lograr esto.

Los siguientes ejemplos todos asumen que su tabla se denomina table1y que sus campos son id, class, versiony fruit(no fruit?) - cambiar lo que no proceda de acuerdo con sus datos.

Nota: los siguientes ejemplos suponen que su fruitcampo es un campo de texto . Si su fruitcampo es en realidad un campo booleano (sí / no) , elimine las comillas simples 'No'en los siguientes ejemplos.


Usando una subconsulta unida:

select u.id, u.class
from table1 u inner join
(
    select t.id, max(t.version) as mv
    from table1 t
    where t.fruit = 'No'
    group by t.id
) v on u.id = v.id and u.version = v.mv

Aquí, la subconsulta selecciona el mayor versionpara cada uno idde los registros donde fruit = 'No'y esto se une al conjunto de datos completo para devolver los campos requeridos para cada idy version.


Usando una subconsulta correlacionada:

select t.id, t.class
from table1 t
where t.fruit = 'No' and not exists
(select 1 from table1 u where u.id = t.id and u.fruit = 'No' and u.version > t.version)

Aquí, la selección se realiza completamente dentro de la WHEREcláusula, que, para cada registro, prueba si existe otro registro en el conjunto con el mismo idy mayor version, y si es así, el registro no se devuelve.


Usando un LEFT JOINcriterio de unión desigual:

select t.id, t.class
from table1 t left join table1 u on t.id = u.id and t.version < u.version
where t.fruit = 'No' and u.id is null

Este ejemplo solo se puede representar en MS Access en la vista SQL, ya que el Diseñador de consultas de MS Access no puede mostrar combinaciones que tengan criterios de combinación iguales (es decir, donde un campo es igual a otro).

Este ejemplo es similar en operación a la subconsulta correlacionada, pero la selección se realiza mediante la unión, en lugar de dentro de la WHEREcláusula.


Finalmente, tenga en cuenta que el resultado de su ejemplo dado es incorrecto: classel máximo versionpara id = 'Onion'debe ser WEST, no NORTH.

Lee Mac
fuente