2015-05-13 3 views
1

У меня есть таблица FilesList, где rowid - столбец идентичности.Последнее обновление отдельных записей - sql

RowId FileId FileName ColMatch 
    1  1 file1.csv 0 
    2  1 file2.csv 0 
    3  1 file1.csv 1 
    4  1 file2.csv 1 

Я хотел бы иметь только последние обновленные записи, из различных имен файлов, для конкретного FILEID (1 в этом случае)

Скажет, после щёток запуска прикладного (C#), то записи с RowId 1 & 2 вставлены в таблицу. После второго запуска вставлены RowId 3 & 4.

Теперь для отчета, я хотел бы видеть только 3 & 4.

например:

RowId FileId FileName ColMatch 
    3  1 file1.csv 1 
    4  1 file2.csv 1 

Это нормально, если результирующий набор не имеет RowId & FILEID.

Как это сделать.

EDIT: Давайте скажем FILEID (1 в этом случае) имеет 3 связанные с ним файлы (file1, file2, file3). В этом случае я могу сделать,

select top 3 from FilesList order by rowid desc 

но проблема, я не знаю, как могут различные имена файлов могут быть связаны с конкретным FILEID.

+2

Просьба уточнить вашу конкретную проблему или добавить дополнительные детали, чтобы выделить именно то, что вам нужно. Трудно сказать, что именно вы спрашиваете. –

+0

@ Энди, я добавил еще текст. Пожалуйста, проверьте, имеет ли это значение сейчас. – Qwerty

+1

В каком поле в таблице указано, будут ли новые записи? Он ищет «ColMatch», но это не ясно. –

ответ

2

Если последняя запись определяется RowId, Вы можете использовать ROW_NUMBER с Partition By FileName с порядком 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 

Образец Fiddle

+0

не дает точного результата – mohan111

+0

Большое спасибо @ughai – Qwerty

+0

@ mohan111 - Не могли бы вы рассказать о своем комментарии? – ughai

0

Согласно моему пониманию, ваша проблема будет решить д, получив наибольший RowId для конкретного файла (Предполагая, что приложение вставляет строку последовательно.)

Это позволит решить цели:.

select * from FilesList where RowId in(select MAX(RowId) from FilesList group by (FileName)) 

Вы можете применять фильтры для FILEID, чтобы получить результат (1 в этот случай):

select * from FilesList where RowId in(select MAX(RowId) from FilesList where FileId = '1' group by (FileName)) 
0
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 
Смежные вопросы