按窗口查询中的派生列排序

Order by derived column in a windowed query

我有如下窗口查询:

SELECT *
FROM
    (
        SELECT COUNT(*) OVER (PARTITION BY NULL) AS TotalRows,
        ROW_NUMBER() OVER
        (
            ORDER BY MyDerivedColumn asc
        ) AS RowNumber
        ,MyDerivedColumn = (SELECT TOP 1 SomeColumn FROM SomeTable ORDER BY SomeOtherColumn DESC)
            ...

而且我无法按派生列对其进行排序(如上所示)。通过使用 order by 子句中的列索引,我已经能够使用 "regular" 查询按派生列排序 IE:

ORDER BY 2

但是我在尝试执行我的窗口化查询时收到错误消息:

Windowed functions do not support integer indices as ORDER BY clause expressions.

我怎样才能像上面那样按派生列排序?

TIA

编辑:根据请求发布我的实际代码。

    SET @SQL = '
SELECT *
FROM
    (
        SELECT COUNT(*) OVER (PARTITION BY NULL) AS TotalRows,
        ROW_NUMBER() OVER
        (
            ORDER BY StudentDissertationStageDescription ASC
        ) AS RowNumber,
        sc.FirstName
        ,sc.LastName
        ,sc.StudentId
        ,spos.ProgramOfStudy AS ProgramOfStudy
        ,(
            SELECT TOP 1 [StudentDissertationStageDescription]
            FROM
                [StudentDissertationStage] AS sd
            WHERE sc.StudentId = sd.StudentId
            ORDER BY sd.[StudentDissertationStage] DESC
        ) AS StudentDissertationStageDescription 
    FROM 
        StudentClasses AS sc
    LEFT JOIN
        StudentProgramOfStudy AS spos
    ON
        spos.StudentId = sc.StudentId
    LEFT JOIN [dbo].[FacultyAssignments] fa 
         ON sc.StudentId = fa.StudentID
    WHERE 1 = 1
    '
    IF @filter IS NOT NULL
    BEGIN
        SET @SQL = @SQL + @filter
    END
    SET @SQL = @SQL + '
    GROUP BY
        sc.FirstName
        ,sc.LastName
        ,sc.SyStudentID
        ,spos.ProgramOfStudy
    ) AS TheTableSet
    WHERE
        RowNumber BETWEEN ' + 
        CONVERT(nvarchar(10), @startrow) + 
        ' AND ' + 
        CONVERT(nvarchar(10), @endrow) + ''
    EXEC(@SQL)

这是你想要的吗?

;with cte as (
    select
        1 as num,
        (SELECT TOP 1 SomeColumn FROM SomeTable ORDER BY SomeOtherColumn DESC) as MyDerivedColumn
)
SELECT
    COUNT(*) OVER (PARTITION BY NULL) AS TotalRows,
    ROW_NUMBER() OVER (ORDER BY MyDerivedColumn asc) AS RowNumber
FROM cte

您还可以使用子查询编写该查询:

SELECT
    COUNT(*) OVER (PARTITION BY NULL) AS TotalRows,
    ROW_NUMBER() OVER (ORDER BY MyDerivedColumn asc) AS RowNumber
FROM (
    select
        1 as num,
        (SELECT TOP 1 SomeColumn FROM SomeTable ORDER BY SomeOtherColumn DESC) as MyDerivedColumn
) t

这样,您的代码将如下所示:

SET @SQL = '
SELECT *
FROM
    (
        SELECT
            COUNT(*) OVER (PARTITION BY NULL) AS TotalRows,
            ROW_NUMBER() OVER (ORDER BY StudentDissertationStageDescription ASC) AS RowNumber,
            sc.FirstName,
            sc.LastName
            sc.StudentId
            spos.ProgramOfStudy AS ProgramOfStudy
        FROM (
            sc.FirstName,
            sc.LastName,
            sc.StudentId,
            spos.ProgramOfStudy AS ProgramOfStudy,
            (
                SELECT TOP 1 [StudentDissertationStageDescription]
                FROM [StudentDissertationStage] AS sd
                WHERE sc.StudentId = sd.StudentId
                ORDER BY sd.[StudentDissertationStage] DESC
            ) AS StudentDissertationStageDescription,
            DissertationChair = staff.[FirstName] + '' '' + staff.[LastName],
            DissertationEmail = staff.[email]
            FROM StudentClasses AS sc
            LEFT JOIN StudentProgramOfStudy AS spos ON spos.StudentId = sc.StudentId
            LEFT JOIN [dbo].[FacultyAssignments] fa ON sc.StudentId = fa.StudentID
            WHERE 1 = 1
            '
            IF @filter IS NOT NULL
            BEGIN
                SET @SQL = @SQL + @filter
            END
            SET @SQL = @SQL + '
        ) t
        GROUP BY
            t.FirstName,
            t.LastName,
            t.SyStudentID,
            t.ProgramOfStudy
    ) AS TheTableSet

    WHERE
        RowNumber BETWEEN ' + CONVERT(nvarchar(10), @startrow) + ' AND ' + CONVERT(nvarchar(10), @endrow)

EXEC(@SQL)