2013-03-27 48 views
1

我想获得该表下方的岛屿:SQLite的查询到组连续数字范围为不同分组的设置

Group FromMemberNo  ToMemberNo 
A    100    101 
A    200    204 
X    100    101 
X    301    302 
A    500    500 
A    600    600 

Group MemberNo 
A   100 
A   101 
A   200 
A   201 
A   202 
A   203 
X   100 
X   101 
A   204 
X   301 
X   302 
A   500 
A   600 

我想用SQL(岛屿)得到这个结果

我已经看到了很多代码/论坛,但没有使用SQLite,因为SQLite没有CTE。

100-101是连续的,所以它会被组合成一个。

有谁知道如何在SQLite中做到这一点?

回答

1

这样做的最快方法是在循环中遍历此表的有序记录并手动收集岛。

在纯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和第一MemberNoM可以计算如下:

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)