gpt4 book ai didi

mysql - 在不改变记录顺序的情况下找到 MIN 和 MAX 的组记录。间隙和孤岛?

转载 作者:行者123 更新时间:2023-11-29 03:30:32 25 4
gpt4 key购买 nike

**编辑 - 由于似乎没有人能为我提供答案,有人可以告诉我如何在 Crystal Reports 中完成此任务吗?我想使用 SQL 创建具有所述分组的 View ,但如果有人可以帮助我,我也可以在 Crystal 中进行分组?我很绝望!谢谢你!丽莎

** 原始帖子 - 我想使用 MIN 和 MAX 值将记录分组在一起而不打扰记录的顺序。(但是我不确定使用 MIN/MAX 是执行此操作的方法,我阅读了“差距和岛屿”以及关于“分区”功能,这可能是我应该使用的......?)

POC 和 POT 值必须按顺序排列,因为它们是道路上的线性值。换句话说,POC 10500 是道路的起点,16000 是道路的终点,中间的值是道路沿线发生的事件,需要保持线性顺序。

CREATE TABLE RoadStations
(`id` int, `roadname` varchar(15), `inspection` date, `POC` int, `POT` int, `rate` varchar(2), `up` varchar(2))

INSERT INTO RoadStations
(`id`, `roadname`, `inspection`,`POC`,`POT`,`rate`,`up`)
VALUES
(1, 'A Branch', '20150321', 10500, 10900, 'C', 1 ),
(2, 'A Branch', '20150510', 10900, 11500, 'C', 1 ),
(3, 'A Branch', '20150510', 11500, 12000, 'C', 1 ),
(4, 'A Branch', '20150510', 12000, 13200, 'C', 1 ),
(5, 'A Branch', '20150510', 13200, 14500, 'C', 1 ),
(6, 'A Branch', '20150510', 14500, 14800, 'C', 1 ),
(7, 'A Branch', '20150510', 14800, 15100, 'C', 2 ),
(8, 'A Branch', '20150510', 15100, 16000, 'C', 1 )

SELECT * FROM RoadStations

ID roadname inspection POC POT rate up
1 A Branch Mar 21, 2015 10500 10900 C 1
2 A Branch May 10, 2015 10900 11500 C 1
3 A Branch May 10, 2015 11500 12000 C 1
4 A Branch May 10, 2015 12000 13200 C 1
5 A Branch May 10, 2015 13200 14500 C 1
6 A Branch May 10, 2015 14500 14800 C 1
7 A Branch May 10, 2015 14800 15100 C 2
8 A Branch May 10, 2015 15100 16000 C 1

我需要查询上表以按以下方式对值进行分组:

第 1 行应与 POC 10500、POT 10900 分组为自己的行,因为日期更改为第 2 行中的新值。

第 2-6 行应与 POC 10900、POT 14800 分组为一行,因为在第 7 行的“向上”值发生变化之前,所有值都是相同的。

第 7 行应与 POC 14800、POT 15100 分组为自己的行,因为“up”的值在第 8 行中再次发生变化。

第 8 行应与 POC 15100、POT 16000 分组为自己的行,因为“up”的值再次发生变化。

使用常规 GROUP 函数不起作用:

SELECT
roadname, inspection, min(POC), max(POT), rate, up
FROM
RoadStations
GROUP BY roadname, inspection, rate, up

roadname inspection POC POT rate up
A Branch Mar 21, 2015 10500 10900 C 1
A Branch May 10, 2015 10900 16000 C 1
A Branch May 10, 2015 14800 15100 C 2

上面的分组不是我想要的结果,因为它将第 8 行与第 2-6 行记录分组。

这是我想要的结果:

roadname    inspection        POC      POT    rate  up
A Branch Mar 21, 2015 10500 10900 C 1
A Branch May 10, 2015 10900 14800 C 1
A Branch May 10, 2015 14800 15100 C 2
A Branch May 10, 2015 15100 16000 C 1

如您所见,POC和POT值的顺序在分组过程中没有被打乱。

最佳答案

这是相当复杂的逻辑。您可以使用的一种选择是编写一个函数。

我会像这样定义一些变量和游标:

DECLARE _currentroad varchar(15);
DECLARE <other variables to store values of POC, POT, rate, up>
DECLARE CUR1 CURSOR FOR SELECT roadname, inspection, POC, POT, rate, up from RoadStations;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

并在循环中将其取入变量:

OPEN CUR1;
REPEAT
FETCH cur1 INTO @roadname, @inspection, @poc, @pot, @rate, @up
IF NOT done THEN
<your business logic goes here>
END IF;
UNTIL done END REPEAT;

这是它更多参与的地方。如果声明的变量为空,您将需要填充它们,然后将这些值与下一个获取的行进行比较。

当您获取行时,如果您的“分组依据”值(道路名称、检查、费率和向上)都没有更改,您将需要用较新的值替换 POT 变量的值,然后打印保存的值当您找到重置循环的行时(当道路名称、检查、费率或向上更改时)。

关于mysql - 在不改变记录顺序的情况下找到 MIN 和 MAX 的组记录。间隙和孤岛?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31301736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com