排序记录ORDER BY问题

时间:2015-03-26 14:59:52

标签: sql sql-server-2008 sql-server-2008-r2

首先请理解问题。不要说用

按SectionName,ZoneName订购

使用Order by将随机播放部分和区域名称顺序..但我需要保持...

从一张表中考虑以下6行3列。

Section 1   Z1  1
Section 1   Z2  2
Section 3   Z1  3
Section 3   Z2  4
Section 1   Z1  5
Section 2   Z1  6

第1行和第1区的第5行意味着它应该在第2个位置而不是第5个位置。剩下的应该是这样的。意思是我希望结果像。

Section 1   Z1  1
Section 1   Z1  5
Section 1   Z2  2
Section 3   Z1  3
Section 3   Z2  4
Section 2   Z1  6

部分和区域名称可能是任何东西,第三列几乎相同意味着它将是序列字段。

请建议我该怎么做..

更新 考虑我们从数据库中逐行获取行到另一个临时表,其中SectionName,ZoneName成为唯一键,所以第4行似乎都很好,但是对于5行,因为Section1和Zone1已经在临时表中 所以我想在第1行附近插入第5个,在第1行附近插入第1区...通过这种方式我将得到我所需的结果。

如果我们使用订单,我们将获得差异结果。请检查

 Section 1  Z1  1
 Section 1  Z1  5
 Section 1  Z2  2
 Section 2  Z1  6
 Section 3  Z1  3
 Section 3  Z2  4

检查第2部分应位于底部但位于中间..

2 个答案:

答案 0 :(得分:0)

您不能依赖表格中的行顺序。如果您需要维护特定订单,请考虑创建一个新表来存储订单。

示例数据:

create table temp_t (
  section varchar(10),
  zone varchar(2),
  zone_order int
);

insert into temp_t values ('Section 1','Z1',1);
insert into temp_t values ('Section 1','Z2',2);
insert into temp_t values ('Section 3','Z1',3);
insert into temp_t values ('Section 3','Z2',4);
insert into temp_t values ('Section 1','Z1',5);
insert into temp_t values ('Section 2','Z1',6);

保持预期订单的新表:

create table temp_t_sort (
  section varchar(10),
  zone varchar(2),
  sort_order int
);

insert into temp_t_sort values ('Section 1','Z1',1);
insert into temp_t_sort values ('Section 1','Z2',2);
insert into temp_t_sort values ('Section 3','Z1',3);
insert into temp_t_sort values ('Section 3','Z2',4);
insert into temp_t_sort values ('Section 2','Z1',5);

查询以获得所需内容:

select t.section, t.zone, t.zone_order
from temp_t t
join temp_t_sort s on t.section = s.section and t.zone = s.zone
order by s.sort_order, t.zone_order;

答案 1 :(得分:0)

如果我理解正确,你想保留(Section,Zone)组合的第一次出现的顺序,然后在每个重复组合的末尾追加组合。这是通过将每一行指向找到类似组合的最小id来完成的。然后按2个ID排序:

DECLARE @t TABLE ( ID INT, S INT, Z INT )

INSERT  INTO @t
VALUES  ( 1, 1, 1 ),
        ( 2, 1, 2 ),
        ( 3, 3, 1 ),
        ( 4, 3, 2 ),
        ( 5, 1, 1 ),
        ( 6, 2, 1 );

WITH    cte
          AS ( SELECT   * ,
                        ( SELECT    MIN(ID)
                          FROM      @t t2
                          WHERE     t2.S = t1.S AND t2.Z = t1.Z
                        ) AS LinkID
               FROM     @t t1
             )
    SELECT  ID, S, Z
    FROM    cte
    ORDER BY LinkID , ID

输出:

ID  S   Z
1   1   1
5   1   1
2   1   2
3   3   1
4   3   2
6   2   1