带有分组的SQL ORDER BY

我有以下查询

SELECT Id, Request, BookingDate, BookingId FROM Table ORDER BY Request DESC, Date

如果一行有类似的ForeignKeyId,我希望它在下一个有序行之前进入,如:

Request         Date  ForeignKeyId
Request3    01-Jun-11   56
Request2    03-Jun-11   89
NULL        03-Jun-11   89
Request1    05-Jun-11   11
NULL        20-Jul-11   57

我一直在看RANK和OVER,但还没有找到一个简单的解决方案.

编辑

我在上面编辑过,使用Andomar的答案中的以下查询显示实际字段和粘贴数据

select  *
from    (
        select  row_number() over (partition by BookingId order by Request DESC) rn 
        ,       Request, BookingDate, BookingID
        from    Table
        WHERE Date = '28 aug 11'
        ) G
order by
     rn   
,       Request DESC, BookingDate 

1   ffffff  23/01/2011 15:57    350821
1   ddddddd 10/01/2011 16:28    348856
1   ccccccc 13/09/2010 14:44    338120
1   aaaaaaaaaa  21/05/2011 20:21    364422
1   123 17/09/2010 16:32    339202
1       NULL    NULL
2   gggggg  08/12/2010 14:39    346634
2       NULL    NULL
2       17/09/2010 16:32    339202
2   NULL    10/04/2011 15:08    361066
2   NULL    02/05/2011 14:12    362619
2   NULL    11/06/2011 13:55    366082
3       NULL    NULL
3       16/10/2010 13:06    343023
3       22/10/2010 10:35    343479
3       30/04/2011 10:49    362435

预订ID 339202应该彼此相邻,但不能

最佳答案 你可以通过ForeignKeyId进行分区,然后在它们的“head”下面排序每一秒或者一行.将“head”定义为ForeignKeyId的第一行.例如,按请求排序:

; with  numbered as 
        (
        select  row_number() over (partition by ForeignKeyID order by Request) rn
        ,       *
        from @t
        )
select  *
from    numbered n1
order by
        (
        select  Request 
        from    numbered n2 
        where   n2.ForeignKeyID = n1.ForeignKeyID 
                and n2.rn = 1
        )
,       n1.Request

子查询是必需的,因为SQL Server不允许order by子句中的row_number.

完整的例子在SE Data.

点赞