根据分组对SQL查询结果进行编号

时间:2014-11-26 12:03:19

标签: mysql sql select

我有一个包含许多行数据的表,每个数据行都分配了一个部分,由一个字母和一个数字组成(例如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并且还没有接近。

有什么想法吗?

2 个答案:

答案 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