Sql 如何为结果指定正确的行号

Sql 如何为结果指定正确的行号,sql,sql-server,Sql,Sql Server,我有一个SQL: SELECT --CASE WHEN EA.[EntityAttentionTypeId] IS NULL THEN 1000+(ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId] )) ELSE ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId] ) END AS C_NO, ROW_NUMBER() OVER (ORDER BY EA.[En

我有一个SQL:

SELECT 
    --CASE WHEN EA.[EntityAttentionTypeId] IS NULL THEN 1000+(ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId] )) ELSE ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId] ) END AS C_NO,
    ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId]) AS C_NO,
    EA.[EntityAttentionTypeId],
    C.PreName AS C_TITLE,
    C.FirstName AS C_NAME,
    C.LastName AS C_SURNAME,
    C.Email AS C_EMAIL,
    CASE WHEN EA.[EntityAttentionTypeId] = 1 THEN 'MAIN CONTACT' ELSE '' END AS C_COMMENTS,
    CASE WHEN EA.[EntityAttentionTypeId] = 1 THEN 'v' ELSE ' ' END AS C_INV,
    CASE WHEN EA.[EntityAttentionTypeId] = 1 THEN 'v' ELSE ' ' END AS C_UPDATES,
    CASE WHEN EA.[EntityAttentionTypeId] = 1 THEN 'v' ELSE ' ' END AS C_DOWN
FROM
    [CMSTIME].[dbo].[Contacts] C 
LEFT OUTER JOIN 
    [CMSTIME].[dbo].[Entities] E ON E.EntityId = C.EntityId 
FULL OUTER JOIN 
    [CMSTIME].[dbo].[EntityAttentions] EA ON EA.[PeopleId]= C.[ContactId]
WHERE 
    C.ContactId  IN (SELECT Entity2People.EmployeeId 
                     FROM Entity2People 
                     WHERE Entity2People.EntityId =  307)
ORDER BY 
    C_NO
我得到这个结果:

如何更改我的SQL,使我得到底部为Null EntityAttentionTypeId的行,并且C_NO仍然可以读取1、2、3、4…等等

我试过了

CASE WHEN EA.[EntityAttentionTypeId] IS NULL THEN 1000+(ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId] )) ELSE ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId] ) END AS C_NO,
但我得到的是:


提前谢谢大家

我想您需要在
行号()函数中使用
ORDER BY-EntityAttentionTypeId DESC

由于
ASC
将首先放置
NULL
,然后按非NULL值排序,如果您按
DESC
排序,它将最后放置
NULL
。这当然会颠倒非空值的要求顺序,因此如果使用
-
运算符,您可以返回到正确的顺序,同时在末尾保持
Null

e、 g

给出:

C_NO    EntityAttentionTypeId
-----------------------------
1       1
2       2
3       3
4       NULL

我想您需要在
ROW\u NUMBER()函数中使用
ORDER BY-EntityAttentionTypeId DESC

由于
ASC
将首先放置
NULL
,然后按非NULL值排序,如果您按
DESC
排序,它将最后放置
NULL
。这当然会颠倒非空值的要求顺序,因此如果使用
-
运算符,您可以返回到正确的顺序,同时在末尾保持
Null

e、 g

给出:

C_NO    EntityAttentionTypeId
-----------------------------
1       1
2       2
3       3
4       NULL

嗯,我认为这个结果查询应该使用
行数()和
大小写来重新定义
C\u NO

SELECT (ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId]) +
        (CASE WHEN EA.EntityAttentionTypeId] IS NULL THEN 1000 ELSE 0 END)
       ) AS C_NO,
. . .
ORDER BY C_NO;

嗯,我认为这个结果查询应该使用
行数()和
大小写来重新定义
C\u NO

SELECT (ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId]) +
        (CASE WHEN EA.EntityAttentionTypeId] IS NULL THEN 1000 ELSE 0 END)
       ) AS C_NO,
. . .
ORDER BY C_NO;

你可以像C_NO那样做
ROW_NUMBER()(ORDER BY ISNULL(EA.[EntityAttentionTypeId],[very large NUMBER here]),我想你可以像C_NO那样做
ROW_NUMBER()(ORDER BY ISNULL(EA.[EntityAttentionTypeId],[very large NUMBER here]),我想是的,这个更新看起来不错。请注意,您可以将最后的
顺序再次简化为
C_NO
。这是另一个好的地方。我已根据您的建议更改了订单。实际上,使用任何建议的解决方案-您不再需要
行号
。这是不必要的工作量。除非你出于某种原因需要新的号码来代替EntityAttentionTypeId。是的,这个更新看起来不错。请注意,您可以将最后的
顺序再次简化为
C_NO
。这是另一个好的地方。我已根据您的建议更改了订单。实际上,使用任何建议的解决方案-您不再需要
行号
。这是不必要的工作量。除非出于某种原因,您需要新的号码来代替EntityAttentionTypeId。