我有以下两个表(带有一些示例数据)
日志:
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
STATS:
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
每天都会在不同的对象集上分析新日志并将其存储在表LOGS中。 在其他进程中,对包含在这些集合中的对象计算一些统计信息,结果存储在表STATS中。这些统计数据通过几个日志计算(由STARTID和ENDID列标识)。
那么,什么是SQL查询可以为我提供具有相应日志日期的所有对象的最新计算统计数据。
在给定的示例中,结果行将是:
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
因此,使用从第27行到第3行的日志计算第1组的最新统计数据,而从第26行到第28行计算第2组的统计数据。 对象6不在结果行中,因为在最后一段时间内没有任何属性。
最后,我使用MySQL。
任何想法?
答案 0 :(得分:3)
此查询是否适合您的问题?
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
答案 1 :(得分:1)
如果没有联系,您可以使用过滤联接。例如:
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
您的示例结果似乎略有偏差,例如,对于objectid 5没有行,其中频率等于0.35。