MySQL - 使用下N个较小的行加入行

时间:2017-12-13 18:08:37

标签: mysql

我有一张桌子:

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。

由于这些数字也不是常规间隔,因此我无法设置特定限制来查找要加入的最大数量。

我的解决方案:

  1. 我可以创建临时表并使用自动增量ID来执行此操作。

  2. 我可以为一个数字执行此操作,并编写一个脚本来遍历表格。这是对它的查询(现在继续这样做,直到更好的东西出现)

    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
    
  3. 这只需要对所有数字进行一次,然后每天进行一次计算和存储移动平均值。所以速度不是问题。

    想知道解决这个问题的最佳方法是什么。感谢。

    编辑: 这是带有时间戳和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
    

1 个答案:

答案 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;主要和次要,以便我不会得到太多。