SQL复杂分组“在列中”

SQL复杂分组“在列中”,sql,grouping,calculated-columns,Sql,Grouping,Calculated Columns,我有一个表,有3列,按前两列排序: 信 为每个字母排序的数字 同一字母的当前编号与前一编号之间的差异 我想用vanlla SQL计算第四个新列的结果,当第三列的数字在连续记录之间出现差异时,对这些数据进行分组;i、 e 2->4=5-1大于30,用第一条记录的字母编号标记该间隔的所有记录,即A1表示1,2,3 由于相邻数字之间的差异仅对具有相同字母的记录有意义,因此对于新字母的第一条记录,differnce的值为31,这意味着它是一个新的组;i、 e.6 以下是我希望得到的结果: # L

我有一个表,有3列,按前两列排序:

信 为每个字母排序的数字 同一字母的当前编号与前一编号之间的差异 我想用vanlla SQL计算第四个新列的结果,当第三列的数字在连续记录之间出现差异时,对这些数据进行分组;i、 e 2->4=5-1大于30,用第一条记录的字母编号标记该间隔的所有记录,即A1表示1,2,3

由于相邻数字之间的差异仅对具有相同字母的记录有意义,因此对于新字母的第一条记录,differnce的值为31,这意味着它是一个新的组;i、 e.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
现在,我只能通过这个查询找到中断值*,它们的值为1:

select letter
      ,number
      ,cast(difference/30 as int) break
 from table
where cast(difference/30 as int) = 1
即使我能找到这些突破性的价值观,我也无法完成我的任务

有人能帮我找到一种获得列结果的方法吗

提前谢谢


FF

据我所知,您需要构造最后一个结果列。您可以使用concat来执行此操作:

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

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

解决方案的唯一要求是,我的第一条记录在差异字段中的值必须为31,因为当差异大于前一条记录的30时,我需要中断

以下是获取我需要的列结果的查询:

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

我不确定你的代码是否可以工作:1 GROUPBY 2没有聚合函数,不管怎样,你只能得到3条带有*的记录,这些记录我称之为断开值。我需要一个完整的列,就像一个名为RESULTE的列,你的第二个建议不考虑这样一个事实:间隔中的每个记录必须有一个对该间隔的第一个的引用。例如,我的示例中的前3条记录对于DBMS使用的列resultWhich必须具有相同的值?博士后?Oracle?我使用的是Spark Sql,所以我需要尽可能多的标准Sql,因为大多数第三方构造都不可用。