SQL - Query que no doy con la solución

 
Vista:
sin imagen de perfil

Query que no doy con la solución

Publicado por carlos (3 intervenciones) el 09/02/2016 13:04:10
Soy principiante en cuanto a SQL se refiere, y mis conocimientos no llegan (después de numerosos intentos) para conseguir lo que os detallo más abajo, en una query SQL para gestionar un fichero Access.
La tabla contiene "grupos" de registros, los cuales solo se diferencian en la fecha. Necesito extraer dentro de cada "grupo" el más reciente y eliminar el resto. El formato de la fecha es "yyyyymmdd". La tabla contiene cerca de 800.000 registros.
En la imágen os paso un ejemplo de la tabla:

MUCHAS GRACIAS :-)



Imagen1
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Query que no doy con la solución

Publicado por leonardo_josue (1173 intervenciones) el 09/02/2016 16:09:48
Hola Carlos:

Esta es una consulta básica, me sorprende que no hayas encontrado en internet ningún ejemplo que te haya podido ayudar...

Lo primero que tienes que checar es de qué tipo es tu campo fecha... por el formato que tiene puedo suponer que no estás almacenando en un tipo DATE, lo cual es un terrible error. Por ningún motivo debes almacenar fechas en campos VARCHAR o NUMERICOS. Si es el caso, cambia tu campo a DATE, si no es posible el cambio, entonces tendrás que hacer conversiones para manejar entonces las fechas como DATE.

¿por qué es tan importante esto? bueno, porque para encontrar la fecha más reciente debes utilizar la función de agrupación MAX en conjunto con la cláusula GROUP BY... y las funciones de agrupación MIN y MAX sólo funcionan con datos que pueden ser ordenados nominalmente... pero cuando se trata de CADENAS, entonces la ordenación se hace de manera ALFABETICA, lo que puede traer problemas.

Si no sabes cómo funciona la cláusula GROUP BY, pregúntale a SAN GOOGLE, él generalmente tiene la respuesta. Si continuas con problemas postea algo de lo que intentaste hacer y dinos qué problema tienes, no sólo nos digas que hiciste numerosos intentos.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Query que no doy con la solución

Publicado por carlos (3 intervenciones) el 09/02/2016 20:09:12
Muchas gracias por tu/vuestra pronta respuesta, es la primera vez que hago uso de un foro.
El tema es que estoy manejando desde VBnet 2010 un fichero de access y me volví loco con el campo fecha cuando lo trataba de tipo DATE, ya que unas veces me lo trataba como "dd/mm/yyyy" y otras, la aplicación daba problemas porque lo trataba como "mm/dd/yyyy", por esta razón decidí cambiarlo a tipo string.
Necesitaría la consulta sql que aplicándola desde Access, me diera como resultado los registros que he enmarcado en rojo en la imagen de abajo, y me borrara el resto de la tabla, para después probarla desde mi aplicativo.
Muchísimas gracias de nuevo a tod@s (y por vuestra paciencia).



Imagen1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Query que no doy con la solución

Publicado por leonardo_josue (1173 intervenciones) el 11/02/2016 16:07:54
Hola de nuevo:

Tal como te comenté en mi post, el manejar fechas como VARCHAR es una verdadera locura... es un error típico de los programadores hacer esto para "simplificarse" la vida, pero a la larga esto da mas problemas que soluciones. El problema no está en cómo se almacenan las fechas en la BD's, ya que por lo general los DBMS's se manejan con formato ANSI (yyyy-mm-dd), el cómo muestres los datos al usuario final no es problema del Motor, sino de la forma en que haces las consultas, ya que estos formatos pueden depender de la configuración del equipo en que estás haciendo las consultas. (Configuración regional)

Ahora bien, volviendo a tu problema, si puedes cambiar tu campo a tipo DATE, hazlo, y entonces te preocupas sólo por darle el formato que quieres cuando vas a mostrar un dato. En caso de que de plano no puedas cambiar el dato y tengas que seguir manejándolo como VARCHAR, entonces lo primero que debes hacer es la conversión explícita. No tengo en estos momentos ACCESS para poder hacer un ejemplo, pero te explico cómo sería más o menos utilizando MySQL...

Supongamos que tienes tu tabla así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> desc tabla;
+-------+-------------+
| Field | Type        |
+-------+-------------+
| id    | int(11)     |
| fecha | varchar(20) |
+-------+-------------+
2 rows in set (0.01 sec)
 
mysql> SELECT * FROM tabla;
+------+----------+
| id   | fecha    |
+------+----------+
|    1 | 20160101 |
|    1 | 20160102 |
|    1 | 20160103 |
|    2 | 20160110 |
|    2 | 20160113 |
|    2 | 20160123 |
|    3 | 20160115 |
|    3 | 20160130 |
+------+----------+
8 rows in set (0.00 sec)

el primer paso es convertir la cadena a FECHA, (en mySQL puedes utilizar STR_TO_DATE, investiga el equivalente en ACCESS):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT id, fecha cadena,  STR_TO_DATE(fecha, '%Y%m%d') fecha
    -> FROM tabla;
+------+----------+------------+
| id   | cadena   | fecha      |
+------+----------+------------+
|    1 | 20160101 | 2016-01-01 |
|    1 | 20160102 | 2016-01-02 |
|    1 | 20160103 | 2016-01-03 |
|    2 | 20160110 | 2016-01-10 |
|    2 | 20160113 | 2016-01-13 |
|    2 | 20160123 | 2016-01-23 |
|    3 | 20160115 | 2016-01-15 |
|    3 | 20160130 | 2016-01-30 |
+------+----------+------------+
8 rows in set (0.00 sec)

Ahora si, como te mencionamos Isaías y yo, puede utilizar las funciones de agrupación MAX para obtener la fecha más reciente por ID:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT id, MAX(STR_TO_DATE(fecha, '%Y%m%d')) fecha
    -> FROM tabla
    -> GROUP BY id;
+------+------------+
| id   | fecha      |
+------+------------+
|    1 | 2016-01-03 |
|    2 | 2016-01-23 |
|    3 | 2016-01-30 |
+------+------------+
3 rows in set (0.00 sec)

Esto te da la última fecha para cada ID.

Esta insisto es una consulta básica, de las que tienes que saber si o si. En internet hay muchos ejemplos, checa algunos extras para que entiendas bien cómo utilizar las funciones de agrupación.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Query que no doy con la solución

Publicado por carlos (3 intervenciones) el 12/02/2016 18:49:28
Muchisimas gracias Leo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Query que no doy con la solución

Publicado por Isaias (1921 intervenciones) el 09/02/2016 18:02:15
No se si Access maneje la instrucción MIN() y MAX(), tal vez seria tu solucion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar