我有一张桌子:
id timestamp
1 1
23 2
12 4
45 6
3 7
4 8
我需要这个结果:
major minor
1 2
1 4
1 6
2 4
2 6
2 7
我需要加入每个号码,接下来的3个最小号码。由于这些数字是按顺序插入的,我不能使用ID。
由于这些数字也不是常规间隔,因此我无法设置特定限制来查找要加入的最大数量。
我的解决方案:
我可以创建临时表并使用自动增量ID来执行此操作。
我可以为一个数字执行此操作,并编写一个脚本来遍历表格。这是对它的查询(现在继续这样做,直到更好的东西出现):
SELECT * FROM
(SELECT id major_id, timestamp major_timestamp FROM timestamps WHERE interval_id=7 ORDER BY timestamp DESC limit 1) timestamps_major
LEFT JOIN
(SELECT id minor_id, timestamp minor_timestamp FROM timestamps WHERE timestamp < (SELECT timestamp FROM timestamps WHERE interval_id=7 ORDER BY timestamp DESC limit 1) ORDER BY timestamp DESC LIMIT 2) timestamps_minor
ON major_timestamp>minor_timestamp
这只需要对所有数字进行一次,然后每天进行一次计算和存储移动平均值。所以速度不是问题。
想知道解决这个问题的最佳方法是什么。感谢。
编辑: 这是带有时间戳和ID的实际表。我发布的示例只是为了解决问题而简化。
CREATE TABLE `timestamps` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`interval_id` tinyint(3) unsigned NOT NULL,
`timestamp` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `interval_timestamp` (`interval_id`,`timestamp`),
KEY `interval_id` (`interval_id`),
KEY `timestamp` (`timestamp`),
CONSTRAINT `timestamps_ibfk_1` FOREIGN KEY (`interval_id`) REFERENCES `intervals` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=75157 DEFAULT CHARSET=latin1
答案 0 :(得分:1)
这是一个可能的解决方案(请参阅此sqlfiddle来解决它)
SELECT *
FROM mytable major inner join mytable minor
ON minor.timestamp > major.timestamp
WHERE (SELECT COUNT(*) FROM mytable m WHERE m.timestamp < minor.timestamp and m.timestamp > major.timestamp) < 3
ORDER BY major.timestamp, minor.timestamp
我绝对不相信这是最干净的解决方案(我没有做任何事情来处理&#34;关系&#34;对于相同的时间戳),但它确实做了你想做的事情,所以它可能是至少可以建立起来的东西。
我正在做的就是加入表格然后计算行数&#34;&#34;主要和次要,以便我不会得到太多。