我有一组用户记录,其中包含开始和结束日期以及它们所属的一些组,如下所示:
| 已启动|结束|A级|乙|C语言|
| - -| - -| - -| - -| - -|
|2010年1月2日| 2010年2月2日|一个|第0页|一个|
| 2010年3月2日|2010年4月2日|一个|第0页|一个|
| 2010年5月2日|2010年6月2日|一个|第0页|一个|
|2011年1月2日| 2011年2月2日|第0页|第0页|一个|
| 2011年3月2日|2011年4月2日|第0页|第0页|一个|
我正在使用MariaDB,我需要遍历所有记录,并将每条记录与所有其他记录进行比较,以检查它们是否属于同一组(A、B、C),如果是,我将这些记录合并为一条记录,并将***started***中的第一个日期和*end中的最后一个日期以粗体突出显示。
最终结果应如下所示:
| 已启动|结束|A级|乙|C语言|
| - -| - -| - -| - -| - -|
| 2010年1月2日|2010年6月2日|一个|第0页|一个|
| 2011年1月2日|2011年4月2日|第0页|第0页|一个|
我实现了一种方法,创建一个临时表并存储我检查的所有记录,但这需要很多时间。
下面是我的实现:
CREATE PROCEDURE loopOver()
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE id BIGINT UNSIGNED;
DECLARE cur CURSOR FOR SELECT user_id
FROM table1 as f
WHERE NOT EXISTS( -- temp table that contain already check records
SELECT 1
FROM temp_table as t
WHERE f.id = t.id);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
FETCH cur INTO id; -- Get first row
WHILE NOT done
DO
-- This where i create tmp table
call creating_tmp_table(id);
FETCH cur INTO id; -- Get next row
END WHILE;
CLOSE cur;
END //
有没有更快的方法来做这个手术?
先谢谢你。
1条答案
按热度按时间k2arahey1#
您可以选择按
A, B, C
分组的MIN(started)
、MAX(ends)
,如下所示:请参见demo。
如果您在'ends'栏中有Null值,而且您想要将它们选取为'9999-12- 31',您可以使用条件式聚总,如下所示:
请参见demo。