You will need to use a CTE to flatten this out.
This should plug directly into SQL and work with the data given as an example. Obviously, you will need to update the queries for your real data since this is probably not your real schema
create table #tableA (ID int, [rank] int, name varchar(max))
insert into #tableA values(1,100,'Name1')
insert into #tableA values(1,45,'Name2')
insert into #tableA values(2,60,'Name3')
insert into #tableA values(2,42,'Name4')
insert into #tableA values(2,88,'Name5')
insert into #tableA values(3,50,'Name6')
insert into #tableA values(3,50,'Name7')
create table #tableB (ID int, [FileName] varchar(max))
insert into #tableB values(1,'fn1')
insert into #tableB values(2,'fn2')
insert into #tableB values(3,'fn3')
SELECT B.*,A.Name, ROW_NUMBER() OVER (PARTITION BY A.ID ORDER BY A.[rank]) AS RowNum
INTO #RankedTable
FROM #tableB as B
LEFT JOIN (
SELECT A.Id, MAX(A.Rank)as Rank
FROM #tableA AS A
GROUP BY A.Id
) AS NewA
JOIN #tableA AS A
on A.Rank = NewA.Rank
AND A.ID = NewA.Id
on NewA.ID = B.ID
;WITH ConcatenationCTE (ID, [FileName], Name, RowNum)
AS
(
SELECT ID, [FileName], Name, RowNum
FROM #RankedTable
WHERE RowNum = 1
UNION ALL
SELECT #RankedTable.ID, #RankedTable.[FileName],
ConcatenationCTE.Name + ',' + #RankedTable.Name AS Name,
#RankedTable.RowNum
FROM #RankedTable
JOIN ConcatenationCTE
ON ConcatenationCTE.ID = #RankedTable.ID
AND ConcatenationCTE.RowNum +1 = #RankedTable.RowNum
)
SELECT ConcatenationCTE.ID, [FileName], Name
FROM ConcatenationCTE
JOIN
(SELECT ID, MAX(RowNum) AS RowNum
FROM ConcatenationCTE GROUP BY ID) AS FinalValues
ON FinalValues.ID = ConcatenationCTE.ID
AND FinalValues.RowNum = ConcatenationCTE.RowNum