У меня есть таблица базы данных, структурированная так (нерелевантные поля для краткости опущены):
rankings
------------------
(PK) indicator_id
(PK) alternative_id
(PK) analysis_id
rank
Все поля являются целыми числами; первые три (обозначенные «(PK)») являются составным первичным ключом. Данный «анализ» имеет несколько «альтернатив», каждая из которых будет иметь «ранг» для каждого из множества «показателей».
Я ищу эффективный способ сравнения произвольного числа анализов, чьи ранги для любой комбинации альтернатив / индикаторов отличаются. Так, например, если у нас есть эти данные:
analysis_id | alternative_id | indicator_id | rank
----------------------------------------------------
1 | 1 | 1 | 4
1 | 1 | 2 | 6
1 | 2 | 1 | 3
1 | 2 | 2 | 9
2 | 1 | 1 | 4
2 | 1 | 2 | 7
2 | 2 | 1 | 4
2 | 2 | 2 | 9
... тогда идеальный метод определил бы следующие различия:
analysis_id | alternative_id | indicator_id | rank
----------------------------------------------------
1 | 1 | 2 | 6
2 | 1 | 2 | 7
1 | 2 | 1 | 3
2 | 2 | 1 | 4
Я пришел с запросом, который выполняет то, что я хочу, для 2 идентификаторов анализа, но у меня возникают проблемы с обобщением, чтобы найти различия между произвольным числом идентификаторов анализа (то есть пользователь может захотеть сравнить 2 или 5 или 9, или что-то еще, и найдите строки, где хотя бы один анализ отличается от любого другого). Мой запрос:
declare @analysisId1 int, @analysisId2 int;
select @analysisId1 = 1, @analysisId2 = 2;
select
r1.indicator_id,
r1.alternative_id,
r1.[rank] as Analysis1Rank,
r2.[rank] as Analysis2Rank
from rankings r1
inner join rankings r2
on r1.indicator_id = r2.indicator_id
and r1.alternative_id = r2.alternative_id
and r2.analysis_id = @analysisId2
where
r1.analysis_id = @analysisId1
and r1.[rank] != r2.[rank]
(Он помещает значения анализа в дополнительные поля вместо строк. Я думаю, что в любом случае будет работать.)
Как я могу обобщить этот запрос для обработки многих идентификаторов анализа? (Или, в качестве альтернативы, придумайте другой, лучший запрос для выполнения этой работы?) Я использую SQL Server 2005 на случай, если это имеет значение.
При необходимости я всегда могу вытащить все данные из таблицы и посмотреть на различия в коде, но решение на SQL предпочтительнее, так как часто мне нужно заботиться только о нескольких строках из тысяч, и нет смысла передавая их все, если я могу избежать этого. (Однако, если у вас есть веская причина не делать этого в SQL, скажите так - я тоже считаю, что это хороший ответ!)