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
我有一个包含 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