在Access中的sql中分组

时间:2018-10-22 16:19:11

标签: sql ms-access

我有一个像这样的表,其中包含三列FromToSymbol

From   To   Symbol
0      2    dog
2      5    dog
5      9    cat
9      15   cat
15     20   dog
20     40   dog
40     45   dog

我试图编写一个SQL查询,以一种产生以下结果的方式对记录进行分组:

From   To   Symbol
0      5    dog
5      15   cat
15     45   dog

也就是说,如果FromTo的值对于相同的Symbol是连续的,则会创建一条结果记录,该结果记录的最小From和最大的{{1 }}值和To。在上面的示例表中,由于第二条记录在Symbol列中的值为2,与下一条具有相同To的记录中的From值不同(15 ,20(狗),则为同一Symbol(狗)创建两个结果记录。

我尝试将表加入自身,然后分组。但是我不知道该怎么做。我必须在 Microsoft Access 中执行此操作。任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

假设这些值没有重叠,并且间隙用不同的值分开,则可以在MS Access中使用技巧。您需要标识相同的相邻符号。好的,您可以通过使用不同的符号(使用子查询)对前几行进行计数来识别它们。获得这些信息后,剩下的就是聚合:

select symbol, min(from) as from, max(to) as to
from (select t.*,
             (select count(*)
              from t as t2
              where t2.from < t.from and t2.symbol <> t.symbol
             ) as grp
      from t
     ) t
group by symbol, grp;

间隙会使该问题在MS Access中更加困难。

注意:列名不要使用保留字或关键字。这段代码使用了问题中提供的名称,但没有麻烦将它们转义。我认为这只会增加查询的难度。