假设我有一个数据集,其中包含:
Date Id
-------------- ----
11/1/2017 null
11/4/2017 3
11/5/2017 null
11/12/2017 10
null 1
null 2
null 7
null 8
null 9我希望对行进行排序,以便两列都在增加。
使用天真的ORDER BY Date, ID并不能做到这一点:

有个命令
有一种排序满足我想要的排序顺序的结果:

当然,这并不是唯一的顺序:
Date Id
-------------- ---------------
null 1
11/1/2017 null
null 2
11/4/2017 3
null 7
null 8
null 9
11/5/2017 null
11/12/2017 10编程语言可以做到这一点。
我知道我可以在客户端完成这个任务。在函数式程序设计语言中:使用https://softwareengineering.stackexchange.com/questions/247440/what-does-it-mean-for-a-sorting-algorithm-to-be-stable
稳定排序是保持输入集的原始顺序的排序,其中比较算法不区分两个或多个项。 考虑一种排序算法,这种算法根据等级对卡片进行排序,而不是根据匹配进行排序。稳定的排序将保证保持相同等级的卡片的原有顺序,而不稳定的排序则不会。

不幸的是我
单调性增加的行,以尽可能地按时间顺序排列。显然,我更喜欢在服务器上这样做--这非常适合处理大量数据。
如何在Server中执行稳定排序?
示例数据
CREATE TABLE #SortDemo (Date datetime NULL, Id int NULL)
INSERT INTO #SortDemo (Date, Id)
VALUES
('20171101', null),
('20171104', 3),
('20171105', null),
('20171112', 10),
(null, 1),
(null, 2),
(null, 7),
(null, 8),
(null, 9)
SELECT * FROM #SortDemo
ORDER BY Date, Id发布于 2017-12-04 15:03:55
这是一个可以解决的问题。你不必举手说电脑不能用来解决问题。
从数据开始,添加一个新的代理项"Rank“列。
Date Id Rank
-------------- ---- ----
null 7 null
null 1 null
null 9 null
null 2 null
null 8 null
11/1/2017 null null
11/4/2017 3 null
11/5/2017 null null
11/12/2017 10 null
11/13/2017 null null然后将Rank种子发送到Id
UPDATE SortDemo SET Rank = Id
WHERE Id IS NOT NULL
Date Id Rank
-------------- ---- ----
null 7 7
null 1 1
null 9 9
null 2 2
null 8 8
11/1/2017 null null
11/4/2017 3 3
11/5/2017 null null
11/12/2017 10 10
11/13/2017 null null然后,对于带有日期的其余项,我们需要将其分配到"next“级别:
Date Id Rank
-------------- ---- ----
null 7 7
null 1 1
null 9 9
null 2 2
null 8 8
11/1/2017 null null <-- 3
11/4/2017 3 3
11/5/2017 null null <-- 10
11/12/2017 10 10
11/13/2017 null null <-- ?使用
UPDATE SortDemo SET Rank = (
SELECT MIN(Rank) FROM SortDemo s2
WHERE s2.Date >= SortDemo.Date)
WHERE SortDemo.Date IS NOT NULL
Date Id Rank
-------------- ---- ----
null 7 7
null 1 1
null 9 9
null 2 2
null 8 8
11/1/2017 null 3 <--
11/4/2017 3 3
11/5/2017 null 10 <--
11/12/2017 10 10
11/13/2017 null null <-- ?还有一种边缘情况,即在我们之后没有项目;我们可以通过倒退到以前的最高级别来解决这个问题:
UPDATE SortDemo SET Rank = (
SELECT MAX(Rank) FROM SortDemo s2
WHERE s2.Date <= SortDemo.Date)
WHERE SortDemo.Date IS NOT NULL
Date Id Rank
-------------- ---- ----
null 7 7
null 1 1
null 9 9
null 2 2
null 8 8
11/1/2017 null 3
11/4/2017 3 3
11/5/2017 null 10
11/12/2017 10 10
11/13/2017 null 10 <--10我们就完事了
我们现在可以通过代理Rank进行排序,并通过Date进行排序。
SELECT * FROM SortDemo
ORDER BY Rank, Date
Date Id Rank
-------------- ---- ----
null 1 1
null 2 2
11/1/2017 null 3
11/4/2017 3 3
null 7 7
null 8 8
null 9 9
11/5/2017 null 10
11/12/2017 10 10
11/13/2017 null 10解决方案完成。Sql Fiddle
答案是在托管到星期一,所以我可以给人们机会,以赢得声誉解决一个独特的问题。
https://stackoverflow.com/questions/47602058
复制相似问题