2009-11-09 10 views
7

Todo,Acceso consulta SQL: encontrar la fila con la fecha más reciente para cada entrada en una tabla distinta

Estoy seguro de que esto es una cuestión bastante simple consulta SQL, pero estoy seguro de que es una buena manera de , y una muy MALA manera de hacerlo. Dejado en mis propios dispositivos, es probable que termine con este último. Así que ...

Tengo una tabla en Access con los datos que se parece a esto:

ID  Value As_of 
1173 156 20090601 
1173 173 20081201 
1173 307 20080901 
1173 305 20080601 
127  209 20090301 
127  103 20081201 
127  113 20080901 
127  113 20080601 
1271 166 20090201 
1271 172 20081201 
1271 170 20080901 
1271 180 20080601 
... 

Lo que me gustaría conseguir es el "valor" para cada identificador único con el más reciente "Como De "fecha (que está en formato YYYYMM).

lo tanto, mi conjunto de resultados debe tener este aspecto:

ID  Value As_of 
1173 156  20090601 
127  209  20090301 
1271 166  20090201 

Tenga en cuenta que diferentes identificadores tienen distintos "a partir de" las fechas. En otras palabras, no puedo simplemente identificar el más reciente como globalmente, luego seleccionar cada fila con esa fecha.

Por lo que vale, esta tabla tiene aproximadamente 200,000 filas totales, y aproximadamente 10,000 identificadores únicos.

¡Muchas gracias de antemano!

Respuesta

8

Si necesita tanto la fecha como el valor, lo que necesita hacer una combinación:

SELECT ID, Value,As_of 
from yourTable a inner join 
      (SELECT ID, MAX(As_of) as As_of 
      from yourTable group by ID) b 
on a.ID=b.ID and a.As_of = b.As_of 
+0

Radu - Solo quería agradecerle por esta respuesta - funciona a la perfección, y aproximadamente 99.99% más rápido que el "Tamaño máximo seleccionado" original que probé. Saludos, Matt – mattstuehler

+0

Gran trabajo ... :) –

0

No está seguro de qué plataforma usted está mirando para hacer esto, pero en T-SQL se puede hacer lo siguiente:

SELECT t.* 
FROM (
    SELECT ID, MAX(As_Of) as r1 
    FROM myTable 
    GROUP BY ID 
    ) as dt 
INNER JOIN myTable t ON dt.ID = t.ID and dt.r1 = t.As_Of 

Buena suerte!

EDIT: Bueno, mi pobre respuesta me molestaba, así que lo arreglé, a pesar de que esta respuesta ya existe en otro lugar en la página ahora.

+0

lo siento, veo que dicho acceso fue la db. Esto todavía debería funcionar para ti, ¡espero! – Funka

+0

Creo que tenía la intención de agrupar por valor e ID, ya que está solicitando el valor por ID para la fecha máxima. –

+0

-1 Esto ni siquiera hace referencia a la ID, por lo que no cumplirá con la necesidad. Podría estar anidado en otra consulta y funcionar bien ... – Smandoli

0

Creo que lo que busca es la siguiente:

SELECT ID, valor, as_of de nombre_tabla donde as_of = max (as_of) grupo por id

Esto dice para cada ID, encontramos el max as_of, y obtener ese valor.

Esto es genérico sql. No estoy seguro sobre el acceso. Estoy seguro de que si esto no funciona, hay algo similar.

¡Buena suerte! Joe

4

@Funka, eso no funcionará si tiene valores duplicados "valor" para la identificación diferente de - que básicamente le dará una lista agrupados por "valor", no por id ...

@ Joe Justo, los agregados no están permitidos en las cláusulas where sin una subconsulta/teniendo combo también, al menos no en ANSI ...

Esto le dará la lista, pero le dará duplicados, así si tiene varias filas con el mismo id/As_of valores:

select t1.id, t1.value, t1.As_of 
from tableName t1 
join (
     select id as id, max(As_of) as max_as_of 
     from tableName 
     group by id 
    ) t2 
on  t1.id = t2.id 
and  t1.As_of = t2.max_as_of 

Si desea eliminar los duplicados de eso, sólo había desee agregar una distinta a la cima de selección, así:

select distinct t1.id, t1.value, t1.As_of 
from tableName t1 
join (
     select id as id, max(As_of) as max_as_of 
     from tableName 
     group by id 
    ) t2 
on  t1.id = t2.id 
and  t1.As_of = t2.max_as_of 
+0

bueno, ambos son corect! pero, ¿dónde está lo distinto? :-) – Radu094

+0

lo siento, acaba de editar para agregarlo a la consulta inferior ... copiar/pegar ataca de nuevo ... – chadhoc

+0

Chadhoc - Solo quería agradecerle esta respuesta, funciona perfectamente. Te habría acreditado con la "respuesta aceptada", excepto que ya le había dado eso a la publicación de Radu. No estoy seguro de cuál es el protocolo para eso; ambas respuestas fueron igualmente útiles y correctas. Y molestias fueron enviadas al mismo tiempo. – mattstuehler

1

intentar algo como esto

SELECT t1.* 
FROM (SELECT Table1.ID, Max(Table1.As_Of) AS MaxOfAs_Of 
FROM Table1 
GROUP BY Table1.ID 
) AS MaxIDS INNER JOIN Table1 t1 ON MaxIDS.ID = t1.ID 
and MaxIDS.MaxOfAs_Of = t1.As_Of 
Cuestiones relacionadas