2016-05-13 3 views
1

Мне нужна помощь в группировании результатов приведенной ниже таблицы temp с использованием столбца «rank».Поиск наилучшего совпадения с «нечеткой» логикой ранжирования

таблица температуры (MS SQL) выглядят следующим образом:

student_address | school_address | student_st| school_st| district | districtID | rank 
--------------------------------------------------------------------------------------- 
123 some street | 12 apple way | CT  | CT  | 322  |  322 | 0.2 
123 some street | 33 pear street| CT  | NJ  | 039  |  039 | 0.1 
333 another st. |  NULL  | VT  | NULL | 111  |  111 | 0.0 

Я заселена таблица @temp как таковые:

SELECT st.student_address, sc.school_address, st.student_st, sc.district, st.districtID, '0.0' as rank 
FROM students st 
LEFT OUTER JOIN schools sc 
ON st.[District ID] = sc.District 
ORDER BY st.[District ID] asc; 

Я следовал результатам моей темп таблицы рядом обновления, которые изменили столбец «ранг» на основе определенных правил (например, совпадение между школой и учеником = 0,0, только совпадение округа = 0,1, совпадение в округе & совпадение состояния = 0,2 и т. д.). Конечным результатом является то, что строки с высоким рейтингом, скорее всего, показывают фактическую школу ученика или менее ранжированные ряды.

Где мне нужна помощь - это окончательный запрос. Я по сути хочу вернуть всю информацию о студентах (все строки из исходной таблицы студентов) и , скорее всего, соответствующей школы (определяется по рангу).

Нечто подобное (псевдокод)

select student_address, student_st, student_etc, school_address 
from @temp 
where rank = max(rank) 
group by student_address 

Я знаю, что выше не является правильным SQL, но я надеюсь, что это дает вам представление о том, что я пытаюсь достичь?

Спасибо за любые рекомендации.

ответ

0

Вы можете попробовать это:

select student_address, student_st, student_etc, school_address,RANK 
from @temp t1 
group by student_address, student_st, student_etc, school_address,RANK having 
RANK=(select MAX(RANK) from @temp t2 where t1.student_address=t2.student_address) 
+0

Спасибо, но то же, что и мой ответ Джеффу внизу. –

+0

Обновлен запрос. @ CodeSherpa –

+0

Спасибо, это сработало для меня. –

0

Я думаю, вы близки. Вероятно, необходимо использовать подзапрос вроде:

SELECT student_address, student_st, student_etc, school_address 
FROM @temp 
WHERE rank = (SELECT MAX(rank) FROM @temp) 

... хотя мне не хватает, откуда приходит ученик_стит. Выше, однако, выглядит как шаблон, который вы ищете.

+0

Спасибо, Джефф. Но это просто дает мне результаты с максимально возможным рангом. То, что я хочу, является самым высоким рангом, учитывая текущую таблицу @temp. Например, если вы посмотрите на мой стол, вы увидите два варианта «123 some street». В этом случае верните только «12 яблочный путь», так как он имеет более высокий ранг (0.2). –

Смежные вопросы