SQL ORDER BY с группировкой - PullRequest
       0

SQL ORDER BY с группировкой

4 голосов
/ 25 августа 2011

У меня есть следующий запрос

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, но не нашел простого исправления.

EDIT

Я редактировал выше, чтобы показать фактические поля и вставленные данные, используя следующиезапрос из ответа Андомара

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

Идентификатор бронирования 339202 должен отображаться рядом друг с другом, но не

1 Ответ

2 голосов
/ 25 августа 2011

Вы можете partition по ForeignKeyId, а затем отсортировать каждую секунду или нижнюю строку под их "головой". С "головой", определенной как первая строка для этого ForeignKeyId. Пример сортировки по Request:

; 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 не допускает row_number в предложении order by.

Полный пример на Данные SE .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...