我有一个日志表,其中一个字段是filename
。这些文件名的版本在文件名末尾带有后缀。假设我们创建了文件SampleName.xml
但后来不得不修改它 - 新版本将在日志中显示为SampleName_V2.xml
(这可能会无限期地继续增加,但我见过的最多的是V8)。
我需要一种方法SELECT
此日志中的每个条目,但只保留文件名为latest version number
的条目。
我觉得必须对此有一个简单的答案,但我一直在努力想到这一点而且不能来它。
有人有什么想法吗?
编辑:We do have a DateTime field in every row as well
,如果有帮助的话。
答案 0 :(得分: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
答案 1 :(得分: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