2013-08-08 3 views
0

Это вопрос, который я задал вчера, по вопросу this.
я не знаю, если я должен расширить свой первоначальный вопрос, я решил начать новый (медведь со мной ...)Сортировка результата при использовании ROW_NUMBER()

Мои SELECT, как это на данный момент:

SELECT * 
FROM 
(
    SELECT 
     a.guid_column1, b.guidID_column1, c.date_column1, d.guid_column1 
     ROW_NUMBER() OVER (PARTITION BY a.guid_column1, b.guid_column1 ORDER BY c.date_column1 DESC) as rn 
    ... 
    -- JOINS AND WHERE STUFF HERE 
    .... 
) t 
WHERE t.rn = 1 

I получить (ожидаемый) результат:

a.guid_column1 b.guid_column1 c.date_column1 d.guid_column1 
------------------------------------------------------------------- 
a1    b1    07/08/2013  someUniqueID 
a2    b2    05/06/2012  someUniqueID 



Хитрость в том, что я хотел бы разобраться, что результат по dateadd, что-то вроде этого ORDER BY dateadd(month, a.float_column, c.date_column1) asc
a.float_column, конечно, не всегда одинаково (и на самом деле введен пользователем позже).

Есть ли способ сделать это в SQL (я использую SQL Server 2005)

+2

Можете ли вы уточнить, что «a.float_column, конечно, не всегда одинаково (и на самом деле введено пользователем позже)». немного, пожалуйста? – Gidil

+0

Конечно! Это поле в моей форме, которое заполняется пользователем и обычно является числом от 1 до 12. – seph

+0

Является ли a.float_column всегда введенным при запуске запроса? – Hazaart

ответ

2

Ниже запрос будет рассчитать новую дату в Select-ПУНКТЕ.

Если a.float_column - NULL ничего не будет добавлено к исходной дате.

SELECT dateadd(month, ISNULL(t.float_column,0), t.date_column1) as newDate 
    , * 
FROM 
(
    SELECT 
     a.guid_column1, b.guidID_column1, c.date_column1, d.guid_column1, a.float_column 
     ROW_NUMBER() OVER (PARTITION BY a.guid_column1, b.guid_column1 ORDER BY c.date_column1 DESC) as rn 
    ... 
    -- JOINS AND WHERE STUFF HERE 
    .... 
) t 
WHERE t.rn = 1 

ORDER BY newDate ASC 
+1

Обычно ORDER BY 1 следует избегать (в случае добавления полей или изменения порядка поля). – Gidil

+0

Должен ли я сделать это с псевдонимом, а затем для расчетного столбца? – Hazaart

+0

Я не думаю, что это сработает, поскольку в подзапросе присоединяются «a.float_column» и «c.date_column1»? – seph

0

Почему бы вам не добавить колонку в свой подзапрос?

select * 
from 
(
    select 
     a.guid_column1, b.guidID_column1, c.date_column1, d.guid_column1, 
     dateadd(month, a.float_column, c.date_column1) as sort_order, 
     row_number() over (partition by a.guid_column1, b.guid_column1 order by c.date_column1 desc) as rn 
    -- 
    -- JOINS AND WHERE STUFF HERE 
    -- 
) t 
where t.rn = 1 
order by t.sort_order asc 
Смежные вопросы