这样做的最快方法是在循环中遍历此表的有序记录并手动收集岛。
在纯SQL(作为面向集合的语言)中,这并不容易。
首先,我们找出哪个记录是第一个在一个岛上。第一条记录没有以前的记录,即,与同组的记录,但有MemberNo
一个小:
SELECT "Group",
MemberNo AS FromMemberNo
FROM ThisTable AS t1
WHERE NOT EXISTS (SELECT 1
FROM ThisTable AS t2
WHERE t2."Group" = t1."Group"
AND t2.MemberNo = t1.MemberNo - 1)
要找到一个岛上的最后一个记录,我们必须找到纪录最大的MemberNo
仍然属于同一个岛屿,即具有相同的组,并且岛内的所有MemberNo
都是连续的。 我们通过计算它们在第一个和最后一个记录中的值之间的差异来检测连续的MemberNo
。 岛上的最后MemberNo
与组G
和第一MemberNo
M
可以计算如下:
SELECT MAX(MemberNo) AS LastMemberNo
FROM ThisTable AS t3
WHERE t3."Group" = G
AND t3.MemberNo - M + 1 = (SELECT COUNT(*)
FROM ThisTable AS t4
WHERE t4."Group" = G
AND t4.MemberNo BETWEEN M AND t3.MemberNo)
最后,堵塞此为第一个查询:
SELECT "Group",
MemberNo AS FromMemberNo,
(SELECT MAX(MemberNo)
FROM ThisTable AS t3
WHERE t3."Group" = t1."Group"
AND t3.MemberNo - t1.MemberNo + 1 = (SELECT COUNT(*)
FROM ThisTable AS t4
WHERE t4."Group" = t1."Group"
AND t4.MemberNo BETWEEN t1.MemberNo AND t3.MemberNo)
) AS LastMemberNo
FROM ThisTable AS t1
WHERE NOT EXISTS (SELECT 1
FROM ThisTable AS t2
WHERE t2."Group" = t1."Group"
AND t2.MemberNo = t1.MemberNo - 1)