0

我有一个日志表,其中一个字段是filename. 这些文件名在文件名末尾带有后缀。假设我们制作了文件SampleName.xml,但后来不得不修改它——新版本将出现在日志中SampleName_V2.xml(这可能会无限期地继续增加,但我见过的最多的是 V8)。

我需要一种方法来访问SELECT此日志中的每个条目,但只保留带有latest version number文件名的条目。

我觉得这个问题必须有一个简单的答案,但我整天都在想它,却无法想到。

有人有想法么?

编辑:We do have a DateTime field in every row as well,如果有帮助的话。

4

2 回答 2

0

我认为这会给你结果

SELECT TOP(1) filename
FROM table
ORDER BY datetime_field DESC

如果您确定您的版本号按顺序排列,_V1 to _V8这将对您有所帮助

SELECT TOP(1) filename
FROM table
ORDER BY  CAST(RIGHT(SUBSTRING([Filename],1,LEN(SUBSTRING([Filename], 0, 
                        PATINDEX('%.%',[Filename])) + '.') - 1),1) AS INT)

更新 我建议另一种方法,它为您提供最新版本的所有文件名。

;WITH cte AS
(
   SELECT
       ROW_NUMBER() OVER (PARTITION BY LEFT(@products,LEN(@products)-CHARINDEX('_',@products))
                          ORDER BY date_field DESC
                          /*OR order by  CAST(RIGHT(SUBSTRING([Filename],1,LEN(SUBSTRING([Filename], 0, 
                            PATINDEX('%.%',[Filename])) + '.') - 1),1) AS INT) ASC*/
                          ) AS rno,
      filename
   FROM table
 )

 SELECT * FROM cte WHERE rno=1
于 2013-07-25T05:03:13.553 回答
0

这是可以为您完成工作的东西。想法是使用临时表,它也包含不带 _v 后缀的文件名。

我可能已经使这比需要的更复杂,但您将能够明白这一点

DROP TABLE #TmpResults
CREATE TABLE #TmpResults
(
Original nvarchar(100),
WO_Version nvarchar(100),
Last_Update datetime
)

INSERT INTO #TmpResults
(Original, WO_Version, Last_Update)
VALUES 
('file1.xml', 'file1.xml', '01/01/2013'),
('file2.xml', 'file2.xml', '02/01/2013'),
('file2_v2.xml', 'file2.xml', '03/01/2013'),
('file3.xml', 'file3.xml', '01/01/2013'),
('file3_v2.xml', 'file3.xml', '01/02/2013'),
('file3_v3.xml', 'file3.xml', '01/03/2013'),
('file4.xml', 'file4.xml', '05/01/2013'),
('file5.xml', 'file5.xml', '06/01/2013'),
('file5_v2.xml', 'file5.xml', '06/02/2013'),
('file5_v3.xml', 'file5.xml', '06/03/2013'),
('file5_v4.xml', 'file5.xml', '06/04/2013')

SELECT 
P.WO_Version,
(SELECT MAX(Last_Update) FROM #TmpResults T WHERE T.WO_Version = 
P.WO_Version) as  Last_Update,
(SELECT TOP 1 Original 
    FROM #TmpResults T 
    WHERE T.Last_Update = 
   (      SELECT MAX(Last_Update) 
      FROM #TmpResults Tm 
      WHERE Tm.WO_Version = P.WO_Version) ) as Last_FileVersion
FROM
(
SELECT DISTINCT WO_Version
FROM #TmpResults
GROUP BY WO_Version
) P

这是您可以使用 SELECT INTO 填充临时表的 SELECT 查询

SELECT 
Original_File_Name,
REPLACE(@Original_File_Name, 
SUBSTRING(@Original_File_Name, LEN(@Original_File_Name) - CHARINDEX('v_',REVERSE(@Original_File_Name), 1), LEN(@Original_File_Name) - CHARINDEX('v_',REVERSE(@Original_File_Name), 1)), 
SUBSTRING(@Original_File_Name, LEN(@Original_File_Name) - CHARINDEX('.',REVERSE(@Original_File_Name), 1) +1 , LEN(@Original_File_Name) - CHARINDEX('.',REVERSE(@Original_File_Name), 1))) as WO_Version,
Last_Update
FROM OriginalDataTable
于 2013-07-25T18:19:12.580 回答