由mssql内部选择顺序

时间:2014-08-13 12:06:48

标签: sql sql-server sql-order-by where-clause dense-rank

我需要在此内部选择中通过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 

3 个答案:

答案 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值。