求一个排序问题

小小骨头 2017-11-05 10:28:15


在不打乱bsortid的情况下,数据按sortid排序。

直接order by SortId,bSortId;的结果是错误的:



哪位大侠给个思路?

...全文
297 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用#1大大的数据,我猜他想要这样的结果
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
    SortId INT,
    bSortId INT   
)
SET NOCOUNT ON
INSERT INTO t VALUES (12,NULL)
INSERT INTO t VALUES (4,NULL)
INSERT INTO t VALUES (9,NULL)
INSERT INTO t VALUES (2,NULL)
INSERT INTO t VALUES (10,NULL)
INSERT INTO t VALUES (1,1)
INSERT INTO t VALUES (3,2)
INSERT INTO t VALUES (5,3)
INSERT INTO t VALUES (6,4)
INSERT INTO t VALUES (6,5)
INSERT INTO t VALUES (7,6)
INSERT INTO t VALUES (8,7)
INSERT INTO t VALUES (11,8)
INSERT INTO t VALUES (13,9)
INSERT INTO t VALUES (14,10)
INSERT INTO t VALUES (13,11)
INSERT INTO t VALUES (14,12)

select sortid,bsortid
from
	(select 
		sortid 
		,bsortid
		,astb=isnull(bsortid,(select max(b.bsortid) from t b where b.SortId <a.SortId))
	from t a)c
order by astb,sortid
/*
1	1
2	NULL
3	2
4	NULL
5	3
6	4
6	5
7	6
8	7
9	NULL
10	NULL
11	8
12	NULL
13	9
14	10
13	11
14	12
*/
二月十六 2017-11-06
  • 打赏
  • 举报
回复
这个排序有点怪了……其实楼主你把规则描述清楚,怎么写也就清楚了,大概可以这样试试;
用递归的形式先搜索出第一个数了比如bsort=1的,然后递归搜索bsort=2的或者是bsort is null 但是sort<bsort=3对应的sort值的数据。
顺势而为1 2017-11-06
  • 打赏
  • 举报
回复
引用 7 楼 spiritofdragon 的回复:
楼主的需求,其实马上就要讲清楚了。就差一句话:“第二张图的红框内的两行数据,颠倒过来,其他顺序不变,就是我要的期望结果”。问题就清楚了。所以4L应该是正解,5L是没理解,更可笑的是6楼,插入数据和结果数据,都不一样,还贴图。。。是手改结果,贴出来的么?(13,9)都变成了(13,10)。。。
好吧, 算我搞笑, 能够取乐大家, 也算人生一大快事
spiritofdragon 2017-11-06
  • 打赏
  • 举报
回复
所以,我在秀,理解能力。。碰见有些客户,虽然知道需求,但是用专业的术语就是描述不清,这种情况是工作中经常碰到的。。。没办法,甲方说得再不清楚也得给他圆回来。
吉普赛的歌 2017-11-06
  • 打赏
  • 举报
回复
引用 7 楼 spiritofdragon 的回复:
楼主的需求,其实马上就要讲清楚了。就差一句话:“第二张图的红框内的两行数据,颠倒过来,其他顺序不变,就是我要的期望结果”。问题就清楚了。所以4L应该是正解,5L是没理解,更可笑的是6楼,插入数据和结果数据,都不一样,还贴图。。。是手改结果,贴出来的么?(13,9)都变成了(13,10)。。。
还是不要让人家猜, 搞得象在算命,直接说清楚不好吗? 圣意难测啊
spiritofdragon 2017-11-06
  • 打赏
  • 举报
回复
楼主的需求,其实马上就要讲清楚了。就差一句话:“第二张图的红框内的两行数据,颠倒过来,其他顺序不变,就是我要的期望结果”。问题就清楚了。所以4L应该是正解,5L是没理解,更可笑的是6楼,插入数据和结果数据,都不一样,还贴图。。。是手改结果,贴出来的么?(13,9)都变成了(13,10)。。。
顺势而为1 2017-11-06
  • 打赏
  • 举报
回复
直接排序恐怕不行, 除非先两列单独排好序, 再以row_no对应.


IF OBJECT_ID('tempdb..#tmp_data') IS NOT NULL 
        DROP TABLE #tmp_data
GO
CREATE TABLE #tmp_data(
    SortId INT,
    bSortId INT   
)

INSERT INTO #tmp_data VALUES (12,NULL)
INSERT INTO #tmp_data VALUES (4,NULL)
INSERT INTO #tmp_data VALUES (9,NULL)
INSERT INTO #tmp_data VALUES (2,NULL)
INSERT INTO #tmp_data VALUES (10,NULL)
INSERT INTO #tmp_data VALUES (1,1)
INSERT INTO #tmp_data VALUES (3,2)
INSERT INTO #tmp_data VALUES (5,3)
INSERT INTO #tmp_data VALUES (6,4)
INSERT INTO #tmp_data VALUES (6,5)
INSERT INTO #tmp_data VALUES (7,6)
INSERT INTO #tmp_data VALUES (8,7)
INSERT INTO #tmp_data VALUES (11,8)
INSERT INTO #tmp_data VALUES (13,9)
INSERT INTO #tmp_data VALUES (14,10)
INSERT INTO #tmp_data VALUES (13,11)
INSERT INTO #tmp_data VALUES (14,12)

Select SortID,bSortID
From (Select SortID,Row_No=Row_number() over (Order By SortID) From #tmp_data) a
    Join (Select bSortID,Row_No=Row_number() over (Order By bSortID) From #tmp_data) b on a.Row_No=b.Row_No


SortID      bSortID
----------- -----------
1           NULL
2           NULL
3           NULL
4           NULL
5           NULL
6           1
6           2
7           3
8           4
9           5
10          6
11          7
12          8
13          9
13          10
14          11
14          12

shadowpj 2017-11-06
  • 打赏
  • 举报
回复
原始数据里SortId的13对应BSortId里的本来就是9和11,SortId的14对应的10和12。你想达到 1 1 2 null 3 2 4 null 5 4 6 5 7 6 8 7 9 null 10 null 11 8 12 null 13 9 13 10 14 11 14 12 怎么可能?你原数据就不对?????你这个是不一个坑吗?
吉普赛的歌 2017-11-05
  • 打赏
  • 举报
回复
如果你觉得 这个顺序还不对, 那你应该调整的是 SortId 或 bSortId 的值, 而不是来纠结排序的问题。
吉普赛的歌 2017-11-05
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
	SortId INT,
	bSortId INT	
)
SET NOCOUNT ON
INSERT INTO t VALUES (12,NULL)
INSERT INTO t VALUES (4,NULL)
INSERT INTO t VALUES (9,NULL)
INSERT INTO t VALUES (2,NULL)
INSERT INTO t VALUES (10,NULL)
INSERT INTO t VALUES (1,1)
INSERT INTO t VALUES (3,2)
INSERT INTO t VALUES (5,3)
INSERT INTO t VALUES (6,4)
INSERT INTO t VALUES (6,5)
INSERT INTO t VALUES (7,6)
INSERT INTO t VALUES (8,7)
INSERT INTO t VALUES (11,8)
INSERT INTO t VALUES (13,9)
INSERT INTO t VALUES (14,10)
INSERT INTO t VALUES (13,11)
INSERT INTO t VALUES (14,12)

SELECT * FROM t
ORDER BY 
bSortId,SortId
/*
SortId      bSortId
----------- -----------
2           NULL
4           NULL
9           NULL
10          NULL
12          NULL
1           1
3           2
5           3
6           4
6           5
7           6
8           7
11          8
13          9
14          10
13          11
14          12
*/

22,298

社区成员

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

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