使用ROW_NUMBER()时排序结果

时间:2013-08-08 07:36:49

标签: sql sql-server tsql

这是我昨天问过的this问题的后续问题 我不知道是否应该扩展我原来的问题,我决定开始一个新问题(跟我一起......)

我的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

我得到了这样的(预期)结果:

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的{​​{1}}是{当然并不总是相同的(事实上是由用户稍后输入)。

有没有办法在SQL中实现这一点(我正在使用SQL Server 2005)

2 个答案:

答案 0 :(得分:2)

下面的查询将计算SELECT-CLAUSE中的新日期。

如果a.float_columnNULL,则不会在原始日期添加任何内容。

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 :(得分: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