请教一个排序问题

htc_xx 2017-08-29 09:21:30
按照规则排序后,如何再实现另外一个排序,将规则为L的工序插在最接近的顺序号下?



原始数据创建表

CREATE TABLE [dbo].[test2] (
[顺序号] nvarchar(255) NULL ,
[编码] nvarchar(255) NULL ,
[规则] nvarchar(255) NULL
)

-- ----------------------------
-- Records of test2
-- ----------------------------
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'5', N'DX.01195.02.LQC2', N'L')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'32', N'DX.01195.02.LQC1', N'L')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'22', N'DX.01195.02.S001', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'23', N'DX.01195.02.S002', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'24', N'DX.01195.02.S003', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'25', N'DX.01195.02.S004', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'26', N'DX.01195.02.S005', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'27', N'DX.01195.02.S006', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'28', N'DX.01195.02.S007', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'29', N'DX.01195.02.S008', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'30', N'DX.01195.02.S009', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'31', N'DX.01195.02.S010', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'33', N'DX.01195.02.S011', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'34', N'DX.01195.02.S012', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'35', N'DX.01195.02.S013', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'36', N'DX.01195.02.S014', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'37', N'DX.01195.02.S015', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'38', N'DX.01195.02.S016', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'39', N'DX.01195.02.S017', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'40', N'DX.01195.02.S018', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'41', N'DX.01195.02.S019', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'1', N'DX.01195.02.A001', N'A')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'2', N'DX.01195.02.A002', N'A')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'3', N'DX.01195.02.A003', N'A')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'4', N'DX.01195.02.A005', N'A')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'17', N'DX.01195.02.P001', N'P')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'18', N'DX.01195.02.P002', N'P')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'19', N'DX.01195.02.P003', N'P')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'20', N'DX.01195.02.P004', N'P')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'21', N'DX.01195.02.P005', N'P')
...全文
192 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
htc_xx 2017-08-31
  • 打赏
  • 举报
回复
在 sql2000下代码报错
htc_xx 2017-08-30
  • 打赏
  • 举报
回复
[quote=引用 3 楼 u013259585 的回复:] 不好意思,分数写错了。应该是15,少给了5分。下次补回。现在没分了。
htc_xx 2017-08-30
  • 打赏
  • 举报
回复
分值用光了,大神不计分数,可麻烦继续想想好办法,放
二月十六 2017-08-30
  • 打赏
  • 举报
回复
先这样用吧,暂时没想到什么好方法:
;WITH ctea AS (
SELECT *,ROW_NUMBER()OVER( ORDER BY CHARINDEX(规则,'S,A,P')) AS num FROM [test2] WHERE 规则 IN('S','A','P')
),cteb AS(
SELECT *,(SELECT num FROM ctea WHERE ctea.顺序号+1=dbo.test2.顺序号) AS num FROM dbo.test2 WHERE 规则='L'
),ctec AS (
SELECT * FROM ctea
UNION ALL
SELECT * FROM cteb
)SELECT 顺序号,编码,规则 FROM ctec ORDER BY num

  • 打赏
  • 举报
回复


with tmp as(
select a.id as id_a,a.bm as bm_a,a.gz as gz_a,b.id as id_b,b.bm as bm_b,b.gz as gz_b,rownum as px from (
select * from TABLE1 t where t.gz in('S','A','P')
order by decode(t.gz,'S','0','A','1','P','2',t.gz ) ,to_number(id)
) a
left join (select * from TABLE1 t where t.gz not in('S','A','P'))b
on to_number(a.id)+1=to_number(b.id)
)

select id_a,bm_a,gz_a from (
select t.* from tmp t
union all
select t.id_b,t.bm_b,t.gz_b,t.id_a,t.bm_a,t.gz_a,t.px from tmp t where t.id_b is not null
) order by px,id_a
htc_xx 2017-08-30
  • 打赏
  • 举报
回复
[quote=引用 1 楼 z10843087 的回复:] 大神可否帮忙解答下哈,谢谢
OwenZeng_DBA 2017-08-29
  • 打赏
  • 举报
回复
引用 楼主 SECOWU 的回复:
按照规则排序后,如何再实现另外一个排序,将规则为L的工序插在最接近的顺序号下? 原始数据创建表

CREATE TABLE [dbo].[test2] (
[顺序号] nvarchar(255) NULL ,
[编码] nvarchar(255) NULL ,
[规则] nvarchar(255) NULL 
)

-- ----------------------------
-- Records of test2
-- ----------------------------
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'5', N'DX.01195.02.LQC2', N'L')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'32', N'DX.01195.02.LQC1', N'L')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'22', N'DX.01195.02.S001', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'23', N'DX.01195.02.S002', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'24', N'DX.01195.02.S003', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'25', N'DX.01195.02.S004', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'26', N'DX.01195.02.S005', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'27', N'DX.01195.02.S006', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'28', N'DX.01195.02.S007', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'29', N'DX.01195.02.S008', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'30', N'DX.01195.02.S009', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'31', N'DX.01195.02.S010', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'33', N'DX.01195.02.S011', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'34', N'DX.01195.02.S012', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'35', N'DX.01195.02.S013', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'36', N'DX.01195.02.S014', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'37', N'DX.01195.02.S015', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'38', N'DX.01195.02.S016', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'39', N'DX.01195.02.S017', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'40', N'DX.01195.02.S018', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'41', N'DX.01195.02.S019', N'S')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'1', N'DX.01195.02.A001', N'A')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'2', N'DX.01195.02.A002', N'A')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'3', N'DX.01195.02.A003', N'A')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'4', N'DX.01195.02.A005', N'A')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'17', N'DX.01195.02.P001', N'P')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'18', N'DX.01195.02.P002', N'P')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'19', N'DX.01195.02.P003', N'P')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'20', N'DX.01195.02.P004', N'P')
INSERT INTO [dbo].[test2] ([顺序号], [编码], [规则]) VALUES (N'21', N'DX.01195.02.P005', N'P')
这个问题发到技术板块去吧

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧