我需要在此内部选择中通过UserId执行命令(因此在考虑最后一个WHERE子句之前),但是因为我收到错误
ORDER BY子句在视图,内联函数中无效......
我不能这样做。我可以通过JobId按现在的UserId和DENSE_RANK()订购其他方式吗?
大多数UserId值都是NULL,当JobId使用dense_ranked时,我需要对那些JobIds进行排序,以便首先使用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
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
如果您只是想首先列出指定UserId
的所有条目,然后列出未指定的条目,则可以像这样修改DENSE_RANK
表达式:
DENSE_RANK() OVER (ORDER BY CASE WHEN UserId IS NULL THEN 1 ELSE 0 END, JobId)
有效地按两列排序,其中第一列是指示UserId
是否为空的标志,第二列是JobId
。标志为0的行将被赋予比标志为1的行更低的Rnk
值。