SELECT版本化SQL文本字段的最新条目

时间:2013-07-25 04:42:36

标签: sql sql-server tsql

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

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

我觉得必须对此有一个简单的答案,但我一直在努力想到这一点而且不能来它。

有人有什么想法吗?

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

2 个答案:

答案 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