【发布时间】:2020-06-08 13:25:40
【问题描述】:
我有一个这样设置的表:
CREATE TABLE `cn` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`type` int(3) unsigned NOT NULL,
`number` int(10) NOT NULL,
`desc` varchar(64) NOT NULL,
`datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB
number 通常但不一定必须是唯一的。
该表的大部分内容由具有连续 number 条目的行组成。
例如
101010、101011、101012等
我一直在尝试找到一种有效的方法来列出连续数字的范围,以便我可以轻松找出数字“丢失”的位置。我想做的是列出开始编号、结束编号和连续行数。由于可能有重复,我使用SELECT DISTINCT(number) 来避免重复。
我运气不太好 - 大多数这类问题都与日期有关,而且很难一概而论。一个查询永远执行,所以这是不行的。 This answer 有点接近但不完全。它使用CROSS JOIN,当您拥有数百万条记录时,这听起来像是灾难的秘诀。
最好的方法是什么?一些答案使用连接,我对性能表示怀疑。目前只有 50,000 行,但几天内将有数百万条记录,因此每一盎司的性能都很重要。
我想到的最终伪查询类似于:
SELECT DISTINCT(number) FROM cn WHERE type = 1 GROUP BY [consecutive...] ORDER BY number ASC
【问题讨论】:
标签: mysql sql mariadb window-functions gaps-and-islands