Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 获取上次更新的不同记录-sql_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql server 获取上次更新的不同记录-sql

Sql server 获取上次更新的不同记录-sql,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个表FilesList,其中rowid是标识列 RowId FileId FileName ColMatch 1 1 file1.csv 0 2 1 file2.csv 0 3 1 file1.csv 1 4 1 file2.csv 1 对于特定的文件ID(在本例中为1),我只希望有不同文件名的最后更新记录 比方说,在应用程序(C#)的初始运行之后,rowid1和2的记录被插入到表中。第二次运行后,将插入

我有一个表FilesList,其中rowid是标识列

RowId FileId FileName  ColMatch
  1     1    file1.csv  0
  2     1    file2.csv  0
  3     1    file1.csv  1
  4     1    file2.csv  1 
对于特定的文件ID(在本例中为1),我只希望有不同文件名的最后更新记录

比方说,在应用程序(C#)的初始运行之后,rowid1和2的记录被插入到表中。第二次运行后,将插入rowid3和4

现在,对于报告,我只希望看到3和4

例如:

如果结果集没有rowid和fileid,则可以

应该如何做到这一点

编辑: 假设一个FileID(本例中为1)有3个相关文件(file1、file2、file3)。那样的话我能做到

select top 3 from FilesList order by rowid desc

但问题是,我不知道,不同的文件名如何与特定的文件ID相关联。

如果最新记录是由
RowId
定义的,您可以使用
行编号
按文件名分区
,降序为
RowId
。像这样的

查询

;WITH CTE AS 
(
SELECT RowId, FileId, FileName,ColMatch,ROW_NUMBER()OVER(PARTITION BY FileName ORDER BY RowID DESC) rn
FROM FilesList
WHERE FileId = 1
)
SELECT * FROM CTE WHERE rn = 1
样品提琴

  • 重复
  • 无重复

根据我的理解,您的问题将通过获取特定文件名的最大行ID来解决。(假设应用程序按顺序插入行。)

这将解决以下问题:

select * from FilesList where RowId in(select MAX(RowId) from FilesList group by (FileName))
您可以为FileId应用筛选器以获得结果(在本例中为1):


请澄清您的具体问题或添加其他详细信息,以突出显示您所需的内容。很难说清楚你在问什么。@Andy,我又加了一些文字。现在请检查它是否有意义。表中的哪个字段指示记录是否为新记录?它的搜索方式类似于
ColMatch
是,但不清楚。它将是rowId,因为这是一个身份专栏,非常感谢@ughai@mohan111-你能详细谈谈你的评论吗?@ughai对于给定的数据,我没有得到任何结果。你能用我的回答中给出的表数据执行你的查询吗?你应该得到返回的所有数据,因为你的文件名不重复。如果复制文件名,则输出与question@mohan111-用提琴样本检查更新的答案
select * from FilesList where RowId in(select MAX(RowId) from FilesList group by (FileName))
select * from FilesList where RowId in(select MAX(RowId) from FilesList where FileId = '1' group by (FileName) )
declare @t table (RowID INT,FileId INT,Filename VARCHAR(20),Colmatch INT)
insert into @t (RowID,FileId,Filename,Colmatch)values 
(1,1,'file1.csv',0),
(2,1,'file2.csv',0),
(3,1,'file3.csv',1),
(4,1,'file4.csv',1)

;with CTE AS (Select RowID,FileId,Filename,Colmatch,ROW_NUMBER()OVER(PARTITION BY Colmatch ORDER BY (select NULL))RN from @t )
,CTE1 AS (
select MAX(RowID)RowID,FileId,MIN(Filename)Filename,MAX(Colmatch)Colmatch from cte where RN = 1
GROUP BY FileId  )
,CTE2 AS (
select MAX(RowID)RowID,FileId,MIN(Filename)Filename,MAX(Colmatch)Colmatch from cte where RN = 2 
GROUP BY FileId )

select * from CTE1
UNION ALL 
select * from CTE2