Учитывая
input_fid near_fid
465 466
465 467
465 468
466 467
466 468
467 468
469 470
470 471
Как бы мне было сгенерировать вывод:
input_fid near_fids
465 466,467,468
469 470,471
т.е. получить наименьший фид и все фиды, с которыми он связан, избегая дублирования.
Результирующий набор является динамическим и выводится инструментом, который определяет отношения между записями.Таким образом, логика такова, что 465 близок к 466 и 467 и 468, а 466 близок к 467 к 468 и так далее.Но ни одна предыдущая запись не близка к 469, следовательно, новая строка.
Поскольку набор результатов будет отличаться при каждом выполнении запроса, я не могу жестко закодировать логику запроса.
Я играл с различными итерациями опережения и отставания, а также использовал оператор WITH с разной степенью успеха, но ничего, что могло бы заставить меня чувствовать, что я близок.Одна итерация, которая была близка, за исключением дубликатов, была:
WITH n(input_fid, near_fid, level) AS
(
SELECT input_fid, near_fid, 0 as level
from results
where input_fid < near_fid
and input_fid between 465 and 471
and near_fid between 465 and 471
UNION ALL
SELECT m.input_fid, m.near_fid, level + 1
from results
where m.input_fid > m.near_fid
and m.input_fid between 465 and 471
and m.near_fid between 465 and 471
and m.near_fid = n.input_fid
)
SELECT input_fid, level, near_fid =
STUFF((SELECT ', ' + CONVERT (VARCHAR (MAX), near_fid )
FROM n b
WHERE n.input_fid = b.input_fid
AND n.level = b.level
order by near_fid
FOR XML PATH('')), 1, 2, '')
FROM n
where level = 0
GROUP BY input_fid, level