sql – 按多列排序

前端之家收集整理的这篇文章主要介绍了sql – 按多列排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要按两列订购数据,我该怎么做?

这是我的表:

  1. Name | ImpFile | ImpTime
  2. Sam Imp01 2012-05-16 09:54:02.477
  3. Ann Imp01 2012-05-16 09:54:02.478
  4. Mark Imp01 2012-05-16 09:54:02.477
  5. John Import12 2012-05-16 09:55:37.384
  6. Bart Import12 2012-05-16 09:55:37.387
  7. Sasha Import12 2012-05-16 09:55:37.385

我需要通过ImpTime和ImpName对此表进行排序,它应该如下所示:

  1. Name | ImpFile | ImpTime
  2. Import12 2012-05-16 09:55:37.387
  3. Bart Import12 2012-05-16 09:55:37.387
  4. John Import12 2012-05-16 09:55:37.384
  5. Sasha Import12 2012-05-16 09:55:37.385
  6. Imp01 2012-05-16 09:54:02.478
  7. Ann Imp01 2012-05-16 09:54:02.478
  8. Mark Imp01 2012-05-16 09:54:02.477
  9. Sam Imp01 2012-05-16 09:54:02.477

我正在使用此查询,但它不按名称对表进行排序,仅按时间顺序排序,当时间是多行的相同值时.

  1. select Name,ImpFile,ImpTime
  2. from people
  3. union
  4. select distinct '',max(ImpTime)
  5. from people
  6. group by ImpFile
  7. order by ImpTime desc,Name

这个查询给我这样的表:

  1. Name | ImpFile | ImpTime
  2. Import12 2012-05-16 09:55:37.387
  3. John Import12 2012-05-16 09:55:37.384
  4. Bart Import12 2012-05-16 09:55:37.387
  5. Sasha Import12 2012-05-16 09:55:37.385
  6. Imp01 2012-05-16 09:54:02.478
  7. Sam Imp01 2012-05-16 09:54:02.477
  8. Ann Imp01 2012-05-16 09:54:02.478
  9. Mark Imp01 2012-05-16 09:54:02.477

有没有办法同时按这两列排序?

编辑
当我使用ImpFile DESC,ImpTime desc的订单时会发生什么?
它给了我一个像这样的结果表:

  1. Name | ImpFile | ImpTime
  2. Import12 2012-05-16 09:55:37.387
  3. Imp01 2012-05-16 09:54:02.478
  4. Bart Import12 2012-05-16 09:55:37.387
  5. John Import12 2012-05-16 09:55:37.384
  6. Sasha Import12 2012-05-16 09:55:37.385
  7. Ann Imp01 2012-05-16 09:54:02.478
  8. Mark Imp01 2012-05-16 09:54:02.477
  9. Sam Imp01 2012-05-16 09:54:02.477

解决方法

获取每个组的领导者并按降序时间对其进行排序:
  1. with grp(Name,TimeGroup,ImpTime) as
  2. (
  3. select cast(null as varchar(5)),max(ImpTime) as TimeGroup,max(ImpTime) as ImpTime
  4. from people
  5. group by ImpFile
  6. )
  7. select *
  8. from grp
  9. order by TimeGroup desc;

输出

  1. NAME IMPFILE TIMEGROUP IMPTIME
  2. (null) Import12 2012-05-16 09:55:37.3870000 2012-05-16 09:55:37.3870000
  3. (null) Imp01 2012-05-16 09:54:02.4780000 2012-05-16 09:54:02.4780000

然后加入追随者到领导者并获得领导者的时间(TimeGroup):

  1. with grp(Name,max(ImpTime) as ImpTime
  2. from people
  3. group by ImpFile
  4.  
  5. union all
  6.  
  7. select p.Name,p.ImpFile,ldr.TimeGroup,p.ImpTime
  8. from people p
  9. inner join grp ldr -- leader
  10. on ldr.name is null and ldr.ImpFile = p.ImpFile
  11. )
  12. select Name,ImpTime
  13. from grp
  14. order by TimeGroup desc,Name

输出

  1. NAME IMPFILE IMPTIME
  2. (null) Import12 2012-05-16 09:55:37.3870000
  3. Bart Import12 2012-05-16 09:55:37.3870000
  4. John Import12 2012-05-16 09:55:37.3840000
  5. Sasha Import12 2012-05-16 09:55:37.3850000
  6. (null) Imp01 2012-05-16 09:54:02.4780000
  7. Ann Imp01 2012-05-16 09:54:02.4780000
  8. Mark Imp01 2012-05-16 09:54:02.4770000
  9. Sam Imp01 2012-05-16 09:54:02.4770000

查询的逻辑是,我们根据ImpFile将关注者(名字有些人)的时间与其领导者的时间(TimeGroup)对齐.领导者及其追随者有相同的时间组,所以当我们按时间排序时,他们会互相依赖;然后,我们按名称排序

现场测试:http://www.sqlfiddle.com/#!3/c7859/21

如果我们希望组长在其关注者之后出现,只需在ORDER BY上加上一个案例:

  1. with grp(Name,case
  2. when Name is null then 2 -- leader last
  3. else 1 -- followers first
  4. end,Name

输出

  1. NAME IMPFILE IMPTIME
  2. Bart Import12 2012-05-16 09:55:37.3870000
  3. John Import12 2012-05-16 09:55:37.3840000
  4. Sasha Import12 2012-05-16 09:55:37.3850000
  5. (null) Import12 2012-05-16 09:55:37.3870000
  6. Ann Imp01 2012-05-16 09:54:02.4780000
  7. Mark Imp01 2012-05-16 09:54:02.4770000
  8. Sam Imp01 2012-05-16 09:54:02.4770000
  9. (null) Imp01 2012-05-16 09:54:02.4780000

现场测试:http://www.sqlfiddle.com/#!3/c7859/23

这个怎么运作:

  1. with grp(Name,p.ImpTime
  2. from people p
  3. inner join grp ldr -- leader
  4. on ldr.name is null and ldr.ImpFile = p.ImpFile
  5. )
  6. select *
  7. from grp
  8. order by TimeGroup desc,Name;

输出

  1. NAME IMPFILE IMPTIME TIMEGROUP
  2. (null) Import12 2012-05-16 09:55:37.3870000 2012-05-16 09:55:37.3870000
  3. Bart Import12 2012-05-16 09:55:37.3870000 2012-05-16 09:55:37.3870000
  4. John Import12 2012-05-16 09:55:37.3840000 2012-05-16 09:55:37.3870000
  5. Sasha Import12 2012-05-16 09:55:37.3850000 2012-05-16 09:55:37.3870000
  6. (null) Imp01 2012-05-16 09:54:02.4780000 2012-05-16 09:54:02.4780000
  7. Ann Imp01 2012-05-16 09:54:02.4780000 2012-05-16 09:54:02.4780000
  8. Mark Imp01 2012-05-16 09:54:02.4770000 2012-05-16 09:54:02.4780000
  9. Sam Imp01 2012-05-16 09:54:02.4770000 2012-05-16 09:54:02.4780000

现场测试:http://www.sqlfiddle.com/#!3/c7859/25

猜你在找的MsSQL相关文章