我需要按两列订购数据,我该怎么做?
这是我的表:
- Name | ImpFile | ImpTime
- Sam Imp01 2012-05-16 09:54:02.477
- Ann Imp01 2012-05-16 09:54:02.478
- Mark Imp01 2012-05-16 09:54:02.477
- John Import12 2012-05-16 09:55:37.384
- Bart Import12 2012-05-16 09:55:37.387
- Sasha Import12 2012-05-16 09:55:37.385
我需要通过ImpTime和ImpName对此表进行排序,它应该如下所示:
- Name | ImpFile | ImpTime
- Import12 2012-05-16 09:55:37.387
- Bart Import12 2012-05-16 09:55:37.387
- John Import12 2012-05-16 09:55:37.384
- Sasha Import12 2012-05-16 09:55:37.385
- Imp01 2012-05-16 09:54:02.478
- Ann Imp01 2012-05-16 09:54:02.478
- Mark Imp01 2012-05-16 09:54:02.477
- Sam Imp01 2012-05-16 09:54:02.477
我正在使用此查询,但它不按名称对表进行排序,仅按时间顺序排序,当时间是多行的相同值时.
- select Name,ImpFile,ImpTime
- from people
- union
- select distinct '',max(ImpTime)
- from people
- group by ImpFile
- order by ImpTime desc,Name
这个查询给我这样的表:
- Name | ImpFile | ImpTime
- Import12 2012-05-16 09:55:37.387
- John Import12 2012-05-16 09:55:37.384
- Bart Import12 2012-05-16 09:55:37.387
- Sasha Import12 2012-05-16 09:55:37.385
- Imp01 2012-05-16 09:54:02.478
- Sam Imp01 2012-05-16 09:54:02.477
- Ann Imp01 2012-05-16 09:54:02.478
- Mark Imp01 2012-05-16 09:54:02.477
有没有办法同时按这两列排序?
编辑
当我使用ImpFile DESC,ImpTime desc的订单时会发生什么?
它给了我一个像这样的结果表:
- Name | ImpFile | ImpTime
- Import12 2012-05-16 09:55:37.387
- Imp01 2012-05-16 09:54:02.478
- Bart Import12 2012-05-16 09:55:37.387
- John Import12 2012-05-16 09:55:37.384
- Sasha Import12 2012-05-16 09:55:37.385
- Ann Imp01 2012-05-16 09:54:02.478
- Mark Imp01 2012-05-16 09:54:02.477
- Sam Imp01 2012-05-16 09:54:02.477
解决方法
获取每个组的领导者并按降序时间对其进行排序:
- with grp(Name,TimeGroup,ImpTime) as
- (
- select cast(null as varchar(5)),max(ImpTime) as TimeGroup,max(ImpTime) as ImpTime
- from people
- group by ImpFile
- )
- select *
- from grp
- order by TimeGroup desc;
输出:
- NAME IMPFILE TIMEGROUP IMPTIME
- (null) Import12 2012-05-16 09:55:37.3870000 2012-05-16 09:55:37.3870000
- (null) Imp01 2012-05-16 09:54:02.4780000 2012-05-16 09:54:02.4780000
然后加入追随者到领导者并获得领导者的时间(TimeGroup):
- with grp(Name,max(ImpTime) as ImpTime
- from people
- group by ImpFile
- union all
- select p.Name,p.ImpFile,ldr.TimeGroup,p.ImpTime
- from people p
- inner join grp ldr -- leader
- on ldr.name is null and ldr.ImpFile = p.ImpFile
- )
- select Name,ImpTime
- from grp
- order by TimeGroup desc,Name
输出:
- NAME IMPFILE IMPTIME
- (null) Import12 2012-05-16 09:55:37.3870000
- Bart Import12 2012-05-16 09:55:37.3870000
- John Import12 2012-05-16 09:55:37.3840000
- Sasha Import12 2012-05-16 09:55:37.3850000
- (null) Imp01 2012-05-16 09:54:02.4780000
- Ann Imp01 2012-05-16 09:54:02.4780000
- Mark Imp01 2012-05-16 09:54:02.4770000
- Sam Imp01 2012-05-16 09:54:02.4770000
查询的逻辑是,我们根据ImpFile将关注者(名字有些人)的时间与其领导者的时间(TimeGroup)对齐.领导者及其追随者有相同的时间组,所以当我们按时间排序时,他们会互相依赖;然后,我们按名称排序
现场测试:http://www.sqlfiddle.com/#!3/c7859/21
如果我们希望组长在其关注者之后出现,只需在ORDER BY上加上一个案例:
- with grp(Name,case
- when Name is null then 2 -- leader last
- else 1 -- followers first
- end,Name
输出:
- NAME IMPFILE IMPTIME
- Bart Import12 2012-05-16 09:55:37.3870000
- John Import12 2012-05-16 09:55:37.3840000
- Sasha Import12 2012-05-16 09:55:37.3850000
- (null) Import12 2012-05-16 09:55:37.3870000
- Ann Imp01 2012-05-16 09:54:02.4780000
- Mark Imp01 2012-05-16 09:54:02.4770000
- Sam Imp01 2012-05-16 09:54:02.4770000
- (null) Imp01 2012-05-16 09:54:02.4780000
现场测试:http://www.sqlfiddle.com/#!3/c7859/23
这个怎么运作:
- with grp(Name,p.ImpTime
- from people p
- inner join grp ldr -- leader
- on ldr.name is null and ldr.ImpFile = p.ImpFile
- )
- select *
- from grp
- order by TimeGroup desc,Name;
输出:
- NAME IMPFILE IMPTIME TIMEGROUP
- (null) Import12 2012-05-16 09:55:37.3870000 2012-05-16 09:55:37.3870000
- Bart Import12 2012-05-16 09:55:37.3870000 2012-05-16 09:55:37.3870000
- John Import12 2012-05-16 09:55:37.3840000 2012-05-16 09:55:37.3870000
- Sasha Import12 2012-05-16 09:55:37.3850000 2012-05-16 09:55:37.3870000
- (null) Imp01 2012-05-16 09:54:02.4780000 2012-05-16 09:54:02.4780000
- Ann Imp01 2012-05-16 09:54:02.4780000 2012-05-16 09:54:02.4780000
- Mark Imp01 2012-05-16 09:54:02.4770000 2012-05-16 09:54:02.4780000
- Sam Imp01 2012-05-16 09:54:02.4770000 2012-05-16 09:54:02.4780000