2017-06-05 55 views
1

我目前有一個ID和其他元數據旁邊的文檔路徑表,但是相同的文件路徑多次使用不同的ID引用。使用GROUP BY/DISTINCT刪除相似的行

示例數據集中:

ID   FullPath 
1   \\some\file\path.txt 
2   \\some\file\path.txt 
3   \\some\file\path.txt 
4   \\another\file\path.txt 
5   \\another\file\path.txt 

我要回一組不同的路徑,不需要其他的ID。這可能是一個非常簡單的GROUP BY聚合函數,但我無法弄清楚。請幫忙!

我想我想沿着這些線,但是從子查詢中選擇ID而不是路徑,因爲路徑導致它返回所有行。但我無法做到這一點,並通過全路徑GROUP!

select * 
from Documents 
where FullPath in (
    select min(FullPath) 
    from Documents 
    group by FullPath 
) 

結果我後:

ID   FullPath 
1   \\some\file\path.txt 
4   \\another\file\path.txt 
+0

編輯你的問題,並顯示你想要的結果。 –

回答

1

如果我明白你的問題,有多種方法可以做你想做的。但是,使用您所選擇的結構,子查詢應該返回id而不是文件路徑:

select d.* 
from Documents d 
where d.FullPath in (select min(d2.id) 
        from Documents d2 
        group by d2.FullPath 
        ); 

我更自然的方式得到公正的兩列是:

select fullpath, min(id) 
from Documents 
group by fullpath; 

或者,如果你想要其他欄目,請使用row_number()rank()

+0

第二個就是我以前的樣子。只是爲了自己讓事情變得複雜!非常感謝你 –

0

您應該使用分鐘(ID)

select * 
    from Documents 
    where id in (
     select min(id) 
     from Documents 
     group by FullPath 
) 
0

請使用像

EXEC(」 從( SELECT ROW_NUMBER DELETE Duplicate_Row()OVER(PARTITION BY ID ORDER BY ID)RN 從文件
)AS Duplicate_Row WHERE Duplicate_Row.RN> 1' )

0

我想你可以僅僅通過使用組:

SELECT id, FullPath FROM Documents GROUP BY FullPath; 
0

我會寫一個函數,接受一個字符串,並返回字符串到最後。例如, fn_strip_path( '\ PLACE \這裏\ file.txt的')返回'\ PLACE \這裏當然 ,fn_strip_path( '\ PLACE \這裏')返回 '\ PLACE'

然後選擇不同fn_strip_path(full_path)從文件讓你想要你想要的