首先请理解问题。不要说用
按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部分应位于底部但位于中间..
答案 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