SQL 复杂分组 "in column"

SQL complex grouping "in column"

我有一个包含 3 列的 table(按前两列排序):

我想计算(使用 vanlla SQL)第四个新列 RESULT 以在第三列(连续记录之间的数字差异)时对这些数据进行分组; 即 #2 --> 4 = 5-1) 大于 30,用第一条记录的字母编号标记该区间的所有记录(即 A1 代表 #1,#2,#3)。

由于连续数字之间的差异只对具有相同字母的记录有意义,对于新字母的第一条记录,differnce 的值为 31(意味着它是一个新组;即 #6)。

这是我想要得到的结果:

#     Letter      Number      Difference             RESULT (new column)
1     A           1           1                      A1       
2     A           5           4                      A1
3     A           7           2                      A1
4     A           40          33                     A40       (*)
5     A           43          3                      A40       
6     B           1           31                     B1        (*)
7     B           25          24                     B1
8     B           27          2                      B1
9     B           70          43                     B70       (*)
10    B           75          5                      B70

现在我只能通过此查询找到 "breaking values" (*),它们的值为 1:

select letter
      ,number
      ,cast(difference/30 as int) break
 from table
where cast(difference/30 as int) = 1

即使我能够找到这些突破性的价值,我也无法完成我的任务。

谁能帮我找到一种方法来获取 RESULT 列?

提前致谢

FF

据我所知,您需要构建最后一个结果列。您可以使用 concat 来做到这一点:

 SELECT letter
          ,number
          ,concat(letter, cast(difference/30 as int)) result
     FROM table
    HAVING result = 'A1'

经过一些练习和我朋友的一点帮助,我找到了解决我的 sql 问题的可能方法。

解决方案的唯一要求是我的第一条记录在差异字段中的值必须为 31(因为当差异 > 30 时我需要 "breaks" 比前一条记录)。

这是获取我需要的 RESULT 列的查询:

select alls.letter
      ,alls.number
      ,ints.letter||ints.number as result
  from competition.lag alls
      ,(select letter
              ,number
              ,difference
              ,result 
          from (select letter
                      ,number
                      ,difference
                      ,case when difference>30 then 1 else 2 end as result
                  from competition.lag
               ) temp
         where result = 1
       ) ints
 where ints.letter=alls.letter
   and alls.number>=ints.number
   and alls.number-30<=ints.number