首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对多列执行稳定排序?

如何对多列执行稳定排序?
EN

Stack Overflow用户
提问于 2017-12-01 21:58:36
回答 1查看 358关注 0票数 1

假设我有一个数据集,其中包含:

代码语言:javascript
复制
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并不能做到这一点:

有个命令

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

  • 日期列总是在增加。
  • id列值总是在增加。

当然,这并不是唯一的顺序:

代码语言:javascript
复制
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

稳定排序是保持输入集的原始顺序的排序,其中比较算法不区分两个或多个项。 考虑一种排序算法,这种算法根据等级对卡片进行排序,而不是根据匹配进行排序。稳定的排序将保证保持相同等级的卡片的原有顺序,而不稳定的排序则不会。

不幸的是我

  • 910万行
  • 1.8 GB

单调性增加的行,以尽可能地按时间顺序排列。显然,我更喜欢在服务器上这样做--这非常适合处理大量数据。

如何在Server中执行稳定排序?

示例数据

  • 示例SQL Fiddle
代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-04 15:03:55

这是一个可以解决的问题。不必举手说电脑不能用来解决问题。

从数据开始,添加一个新的代理项"Rank“列。

代码语言:javascript
复制
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

代码语言:javascript
复制
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“级别:

代码语言:javascript
复制
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  <-- ?

使用

代码语言:javascript
复制
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 <-- ?

还有一种边缘情况,即在我们之后没有项目;我们可以通过倒退到以前的最高级别来解决这个问题:

代码语言:javascript
复制
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进行排序。

代码语言:javascript
复制
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

答案是在托管到星期一,所以我可以给人们机会,以赢得声誉解决一个独特的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47602058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档