2016-05-13 96 views
1

我需要使用「排名」列將以下臨時表的結果分組結果的幫助。尋找與「模糊」排名邏輯的最佳匹配

臨時表(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) 

...雖然我想念student_street來自哪裏。以上,但看起來像你正在尋找的模式。

+0

謝謝,傑夫。但是,這隻會給我最高等級的成績。我想要的是當前@temp表的最高排名。例如,如果你看我的桌子,你會看到「123 some street」的兩個選項。在這種情況下,只返回「12蘋果方式」,因爲它有更高的等級(0.2)。 –