mariadb 如何在sql中循环遍历数据记录并将元素相互比较

vsikbqxv  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(141)

我有一组用户记录,其中包含开始和结束日期以及它们所属的一些组,如下所示:
| 已启动|结束|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 //

有没有更快的方法来做这个手术?
先谢谢你。

k2arahey

k2arahey1#

您可以选择按A, B, C分组的MIN(started)MAX(ends),如下所示:

SELECT MIN(started) AS started, MAX(ends) AS ends,
       A, B, C
FROM table_name
GROUP BY A, B, C
ORDER BY A, B, C

请参见demo
如果您在'ends'栏中有Null值,而且您想要将它们选取为'9999-12- 31',您可以使用条件式聚总,如下所示:

SELECT MIN(started) AS started,
       MAX(CASE WHEN ends IS NULL THEN '9999-12-31' ELSE ends END) AS ends,
       A, B, C
FROM table_name
GROUP BY A, B, C
ORDER BY A, B, C

请参见demo

相关问题