我有一个包含许多行数据的表,每个数据行都分配了一个部分,由一个字母和一个数字组成(例如A.1)。我需要从此表中检索所有数据并通过此部分对其进行排序。在提取这些数据时,我已被指示在本节中为每一行生成一个新的列编号,从而创建小节(例如A.1.1,A.1.2)
给定一组带有“部分”的数据,例如一个包含2个部分A.1,B.1的表格,我希望能够在附加列“SubNumber”1,2,3等中为每个结果编号。当行是新部分时,此编号必须重新启动。
表示如下表格结果集:
Data | Section | SubNumber
_______________________
record1 | A.1 | 1
record2 | A.1 | 2
record3 | A.1 | 3
record4 | B.1 | 1
record5 | B.1 | 2
我一直在尝试使用SQL来动态创建这个SubNumber并且还没有接近。
有什么想法吗?
答案 0 :(得分:2)
您可以使用变量执行此操作:
select t.*,
(@rn := if(@s = Section, @rn + 1,
if(@s := Section, 1, 1)
)
) as SubNumber
from table t cross join
(select @rn := 0, @s := '') vars
order by Section;
这里的问题是组内的编号是任意。你需要有一些方法来指定数字。确定后,请将该列添加到order by
。
答案 1 :(得分:0)
使用用户变量来添加序列号是可能的,但常见的问题是应用序列号时数据的顺序(而不是查询完成时)。解决方法是使用order by子句在子查询中获取数据,然后在此之后添加序列号。
SELECT sub0.Data, sub0.Section, @seq = if(Section = @section, @seq + 1, if (@Section := section, 1, 1))
(
SELECT Data, Section
FROM sometable
ORDER BY Section, Sequence, LibraryOpNumber
) sub0
CROSS JOIN
(
SELECT @section:='', @seq:=0
) sub1