Sql server CTE分区未返回正确的行号-TSQL

Sql server CTE分区未返回正确的行号-TSQL,sql-server,tsql,Sql Server,Tsql,我正在尝试使用CTE获取文件列表中的最新文件。到目前为止,我有: WITH CTE AS ( SELECT ID, TRISPATH, Document, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Document) AS RN FROM LinkedDocuments ) SELECT ID, Document, RN FROM CTE WHERE

我正在尝试使用CTE获取文件列表中的最新文件。到目前为止,我有:

WITH CTE AS
(
    SELECT 
        ID, TRISPATH, Document, 
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Document) AS RN
    FROM 
        LinkedDocuments
)
SELECT 
    ID, Document, RN 
FROM 
    CTE 
WHERE 
    TRISPATH IS NOT NULL --AND RN!=1
它似乎与一些ID一起工作,它返回我想要的,但是其中一些(大约30%)不是从1开始,而是根据ID以随机数开始:

14  J:\PRS\CVs\Original CVs\2015\N\*****, ***** CL Oct 15.txt   11
14  J:\PRS\CVs\Original CVs\2015\N\*****, ***** CV Nov 15.pdf   12
14  J:\PRS\CVs\Original CVs\2015\N\*****, ***** CV Oct 15.docx  13

我似乎无法理解为什么会发生这种情况,我确信这与分区有关,但我无法理解原因。

如果您有TRISPATH为空的记录,则会为它们分配一个行号,然后在最终选择中过滤掉

要确保行号从1开始,请将WHERE子句移动到CTE:

WITH CTE AS
(
    SELECT ID, TRISPATH, Document, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Document) AS RN
    FROM LinkedDocuments
    WHERE TRISPATH IS NOT NULL 
)
SELECT ID,Document, RN FROM CTE 

如果您有TRISPATH为空的记录,则会为它们分配一个行号,然后在最终选择中过滤掉

要确保行号从1开始,请将WHERE子句移动到CTE:

WITH CTE AS
(
    SELECT ID, TRISPATH, Document, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Document) AS RN
    FROM LinkedDocuments
    WHERE TRISPATH IS NOT NULL 
)
SELECT ID,Document, RN FROM CTE 

您需要找到一种按日期对每个分区排序的方法。是否有文档日期时间戳列可用?理想情况下我会这样做,但这个数据库我设计得非常糟糕,表中唯一的列是ID(相对于文档链接的人)、文档类型(3个值中的1个)和文档,它们都是主键。大多数文档的日期都是上面显示的格式,但不是全部。是否每个文档都以
CV 11月15日为结尾。ext
?差不多是188k中的182k。基于:从LinkedDocuments中选择COUNT(*),其中像“%CV”\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.%这样的文档或像“%CL”\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。是否有文档日期时间戳列可用?理想情况下我会这样做,但这个数据库我设计得非常糟糕,表中唯一的列是ID(相对于文档链接的人)、文档类型(3个值中的1个)和文档,它们都是主键。大多数文档的日期都是上面显示的格式,但不是全部。是否每个文档都以
CV 11月15日为结尾。ext
?差不多是188k中的182k。基于:从LinkedDocuments中选择COUNT(*),其中像“%CV”\uuuuuuuuuuuuuuuuuuuuu.%这样的文档或像“%CL”\uuuuuuuuuuuuuu.%这样的文档和TRISPATH不为空