0

我需要在这个内部选择中按 UserId 进行排序(所以在考虑最后一个 WHERE 子句之前)但是因为我收到错误

ORDER BY 子句在视图、内联函数中无效...

我不能那样做。有没有其他方法可以像现在一样按 UserId 和 DENSE_RANK() 按 JobId 排序?

大多数 UserId 值是 NULL 并且当按 JobId 进行密集排序时,我需要对这些 JobId 进行排序,以便首先是 UserId != NULL

SELECT *, @RecordCount as RecordCount
FROM
(
    SELECT JobId, UserId, DENSE_RANK() OVER(ORDER BY JobId) AS Rnk
    FROM #ListOfJobs
) t
WHERE Rnk between (@pn - 1) * @ps + 1 and @pn * @ps 
4

3 回答 3

0

使用 CTE 获取 dense_rank 然后在派生结果集中按 UserId 排序是什么意思:

;WITH cte AS (

    SELECT JobId, UserId, DENSE_RANK() OVER(ORDER BY JobId) AS Rnk
    FROM #ListOfJobs
    WHERE Rnk between (@pn - 1) * @ps + 1 and @pn * @ps 
)
SELECT * FROM cte
ORDER BY UserId DESC, Rnk 
于 2014-08-13T12:19:18.510 回答
0

如果您只想首先列出所有指定了 where 的条目,UserId然后列出未指定的条目,则可以像这样修改DENSE_RANK表达式:

DENSE_RANK() OVER (ORDER BY CASE WHEN UserId IS NULL THEN 1 ELSE 0 END, JobId)

这有效地按两列排序,其中第一列是指示是否UserId为 null 的标志,第二列是JobId. 标志为 0 的行将被分配Rnk比标志为 1 的行更低的值。

于 2014-08-19T15:01:09.760 回答
0

JobID 和 UserId 都使用 order by 怎么样?

  SELECT TOP 100 PERCENT *, @RecordCount as RecordCount
   FROM
     (
   SELECT JobId, UserId, DENSE_RANK() OVER(ORDER BY JobId) AS Rnk
    FROM #ListOfJobs ORDER BY UserId
    ) t
   WHERE Rnk between (@pn - 1) * @ps + 1 and @pn * @ps 
于 2014-08-13T12:21:43.233 回答