2010-03-08 17 views
6

tengo las dos tablas siguientes (con algunas datas más muestra)Combinar consultas en una consulta

registros:

 
ID | SETID | DATE 
======================== 
1 | 1 | 2010-02-25 
2 | 2 | 2010-02-25 
3 | 1 | 2010-02-26 
4 | 2 | 2010-02-26 
5 | 1 | 2010-02-27 
6 | 2 | 2010-02-27 
7 | 1 | 2010-02-28 
8 | 2 | 2010-02-28 
9 | 1 | 2010-03-01 

Estadísticas:

 
ID | OBJECTID | FREQUENCY | STARTID | ENDID 
============================================= 
1 | 1  | 0.5  | 1 | 5 
2 | 2  | 0.6  | 1 | 5 
3 | 3  | 0.02 | 1 | 5 
4 | 4  | 0.6  | 2 | 6 
5 | 5  | 0.6  | 2 | 6 
6 | 6  | 0.4  | 2 | 6 
7 | 1  | 0.35 | 3 | 7 
8 | 2  | 0.6  | 3 | 7 
9 | 3  | 0.03 | 3 | 7 
10 | 4  | 0.6  | 4 | 8 
11 | 5  | 0.6  | 4 | 8 
7 | 1  | 0.45 | 5 | 9 
8 | 2  | 0.6  | 5 | 9 
9 | 3  | 0.02 | 5 | 9 

Cada día nuevos registros se analizaron en diferentes conjuntos de objetos y almacenados en la tabla LOGS. Entre otros procesos, algunas estadísticas se calculan en los objetos contenidos en estos conjuntos y el resultado se almacena en la tabla STATS. Estas estadísticas se calculan a través de varios registros (identificados por las columnas STARTID y ENDID).

Entonces, ¿cuál podría ser la consulta SQL que me daría las últimas estadísticas calculadas para todos los objetos con las fechas de registro correspondientes?
En el ejemplo dado, las filas de resultado sería:

 
OBJECTID | SETID | FREQUENCY | STARTDATE | ENDDATE 
====================================================== 
    1  | 1 | 0.45 | 2010-02-27 | 2010-03-01 
    2  | 1 | 0.6 | 2010-02-27 | 2010-03-01 
    3  | 1 | 0.02 | 2010-02-27 | 2010-03-01 
    4  | 2 | 0.6 | 2010-02-26 | 2010-02-28 
    5  | 2 | 0.6 | 2010-02-26 | 2010-02-28 

Por lo tanto, las más recientes estadísticas para conjunto 1 se calculan con los registros de FEB 27 a marchar 1 mientras que estadísticas para el conjunto 2 se calculan de FEB 26 a feb 28. objeto 6 no está en las filas de resultados ya que no hay estadísticas en él en el último período de tiempo.

Por último, uso MySQL.

¿Alguna idea?

+0

+1 para una pregunta formulada claramente con buenos datos de muestra. –

+0

¿Es su 0,35 para el objeto 4, 5 un error tipográfico? (debería ser 0.6?) – Patrick

Respuesta

3

¿Responde esta consulta a su pregunta?

SELECT objectid, l1.setid, frequency, l1.date as startdate, l2.date as enddate 
FROM `logs` l1 
INNER JOIN `stats` s ON (s.startid=l1.id) 
INNER JOIN `logs` l2 ON (l2.id=s.endid) 
INNER JOIN 
(
    SELECT setid, MAX(date) as date 
    FROM `logs` l 
    INNER JOIN `stats` s ON (s.startid=l.id) 
    GROUP BY setid 
) d ON (d.setid=l1.setid and d.date=l1.date) 
ORDER BY objectid 
+0

Esto no devolvería una fila para el ID de objeto 6, porque no hay log con setid = 1 para ese objeto – Andomar

+0

No devuelve el ID de objeto 6 lo que se solicita – Patrick

+0

La pregunta es más ambigua de lo que pensaba :) Cómo ¿Podría explicar el frequncy 0.35 para el objeto 5 en los resultados del ejemplo? – Andomar

1

Si no hay vínculos, puede utilizar una unión de filtrado. Por ejemplo:

select stats.objectid 
,  stats.frequency 
,  startlog.setid 
,  startlog.date 
,  endlog.date 
from  stats 
join  logs startlog 
on  startlog.id = stats.startid 
join  logs endlog 
on  endlog.id = stats.endid 
join  (
     select objectid, max(endlog.date) as maxenddate 
     from  stats 
     join  logs endlog 
     on  endlog.id = stats.endid 
     group by objectid 
     ) filter 
on  stats.objectid = filter.objectid 
     and filter.maxenddate = endlog.date 
order by stats.objectid 

tu ejemplo resultados parecen estar ligeramente desviado, por ejemplo, no hay una fila de objectid 5 donde la frecuencia es igual a 0,35.

+0

Está devolviendo objectid 6 lo que no se solicita;) 'objeto 6 no está en las filas de resultados ya que no hay estadísticas en él en el último período de tiempo' – Patrick

Cuestiones relacionadas