按窗口查询中的派生列排序
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)
我有如下窗口查询:
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)