Sql server CTE分区未返回正确的行号-TSQL
我正在尝试使用CTE获取文件列表中的最新文件。到目前为止,我有: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
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不为空