sql - 将查询合并为一个查询

标签 sql mysql

我有以下两个表(带有一些示例数据)

日志:

 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

统计数据:

 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

因此,第 1 组的最新统计数据是使用 2 月 27 日至 3 月 1 日的日志计算的,而第 2 组的统计数据是从 2 月 26 日到 2 月 28 日计算的。 对象 6 不在结果行中,因为在最后一段时间内没有关于它的统计信息。

最后,我使用 MySQL。

有什么想法吗?

最佳答案

这个查询是否符合您的问题?

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

关于sql - 将查询合并为一个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2400832/

相关文章:

sql - 如何在 Azure SQL 数据仓库中解析 JSON 格式的字符串?

sql - RESTRICT_REFERENCES 和触发器

mysql - 在存储过程中更新和删除

mysql - LEFT JOIN 在右表中添加更多字段

java - ORA-00907 : missing right parenthesis when using % wildcard from Java

mysql - 如何在mysql中基于ncarpk连接三个表

sql - postgres 中类型字符 varying(200) 的值太长

mysql - 选择并显示表中具有相同值的行数

php - 删除行wordpress自定义数据库表

mysql - MySQL 中何时使用单引号、双引号和反引号