如何在 SQL 中获取具有不同日期的不同文件名

How to get distinct filenames with different dates in SQL

我有一个 table,其中包含列文件名、项目名和记录插入时间。我想以一种检查前 5 个数字并将其与其他文件名匹配以检查重复项的方式获取不同的文件名。如果存在重复项,那么它只会为同一项目的该文件获取一次文件名,其中包含最新日期。

示例 1: 我现在得到的是两个相同的文件,因此作为重复文件出现,因为您可以看到这两个文件是在不同的日期插入的,文件名的前 5 位数字与文件名中的数字相同。

**Filename**                **Projectname**       **RecordInsertTime**
12345_abcde_mnopqrst          Project1              08/10/2020
12345_abcde_rtyusety          Project1              08/12/2020

示例 2:

**Filename**                **Projectname**       **RecordInsertTime**
56789_fghijk_mnopqrst          Project1              08/10/2020
56789_fghijk_rtyusety          Project1              08/12/2020

期望的输出: 期望的输出是消除重复项并获取具有重复文件名的同一项目的最新文件(具有最新记录插入日期的文件)的文件名。

**Filename**                **Projectname**       **RecordInsertTime**
12345_abcde_mnopqrst          Project1              08/12/2020

我的代码:

   Select replace(replace([FileName],'\project\SSIS ReturnedReport(xyz)\',''),'.xlsx','') as FileName, ProjectName, cast(RecordInsertTime as DATE) as 'RecordInsertTime'from ReturnedFiles where ProjectName is not null

谢谢

有很多方法可以做到这一点,但这是我的方法。获取我正在调用的 FilenamePrefix 和 Projectname 的最大 RecordInsertTime,然后返回到 ReturnedFiles table 以获取与该最大行相关的完整详细信息。

CREATE TABLE ReturnedFiles
(
    Filename VARCHAR(25)
  , Projectname VARCHAR(25)
  , RecordInsertTime DATETIME
);

INSERT INTO ReturnedFiles
VALUES
  ('12345_abcde_mnopqrst', 'Project1', '08/10/2020')
, ('12345_abcde_rtyusety', 'Project1', '08/12/2020')
, ('56789_fghijk_mnopqrst', 'Project1', '08/10/2020')
, ('56789_fghijk_rtyusety', 'Project1', '08/12/2020');

SELECT
           rf.Filename
         , rf.Projectname
         , rf.RecordInsertTime
FROM       (
               SELECT
                        LEFT(Filename, 5)     AS [FilenamePrefix]
                      , Projectname
                      , MAX(RecordInsertTime) AS [MaxRecordInsertTime]
               FROM     ReturnedFiles
               GROUP BY LEFT(Filename, 5)
                      , Projectname
           )              x
INNER JOIN ReturnedFiles rf ON x.FilenamePrefix = LEFT(rf.Filename, 5)
                           AND x.Projectname = rf.Projectname
                           AND x.MaxRecordInsertTime = rf.RecordInsertTime;

Demo.