2011-01-20 4 views
2

У меня есть следующие Инлайн Table-значной функции:Помощь с RANK() Над скалярной функции - SQL Server 2008

SELECT Locations.LocationId, 
     dbo.Search_GetSuitability(@SearchPreferences, 
      Score.FieldA, Score.FieldB, Score.FieldC) AS OverallSuitabilityScore, 
     RANK() OVER (ORDER BY OverallSuitabilityScore) AS OverallSuitabilityRank 

FROM  dbo.LocationsView Locations 
INNER JOIN dbo.LocationScores Score ON Locations.LocationId = Score.LocationId 
WHERE  Locations.CityId = @LocationId 

Это RANK() линия дает мне ошибку:

Invalid column name 'OverallSuitabilityScore'.

Функция dbo.Search_GetSuitability является скалярной функцией , которая возвращает DECIMAL(8,5). Мне нужно присвоить рангу каждой строке на основе этого значения.

Единственный способ, с помощью которого я могу работать над этим, - это добавить вызов функции скалярной функции в часть ORDER BY - это глупо. У меня около 5 таких скалярных вызовов функций, и мне нужно отдельно RANK() значений для каждого.

Что я могу сделать? Могу ли я использовать Common Table Expression (CTE)?

+0

Без приказа, будет не так просто случайным образом выбирать 10 значений? – Thomas

+0

@Thomas - в хранимой процедуре вызова есть OrderBy. – RPM1984

+0

Функция RANK будет правильно назначать значения из-за 'OVER (ORDER BY ...'. Порядок набора результатов не определен. – bobs

ответ

4

Да, вы не можете ссылаться на псевдоним столбца в предложении SELECT. Тем не менее, CTE звучит неплохо. Вот пример:

WITH Score as 
    (
    select Score.LocationId, Score.FieldA, Score.FieldB, Score.FieldC, 
     dbo.Search_GetSuitability(@SearchPreferences, 
      Score.FieldA, Score.FieldB, Score.FieldC) AS OverallSuitabilityScore 
    from dbo.LocationScores 
    ) 

SELECT TOP(10) 
     Locations.LocationId, 
     Score.OverallSuitabilityScore, 
     RANK() OVER (ORDER BY OverallSuitabilityScore) AS OverallSuitabilityRank 

FROM  dbo.LocationsView Locations 
INNER JOIN Score ON Locations.LocationId = Score.LocationId 
WHERE  Locations.CityId = @LocationId 
+0

Удивительный, спасибо. Мне действительно нужно начать изучать CTE - потому что я потратил 70% своей жизни разработчиков на SQL Server 2000, я пропустил все эти потрясающие лакомства. :) Принимая ваш ответ за 45 секунд. .. – RPM1984

2

Старая школьная способ сделать это только для выражения SUBQUERY. СТ здесь только перемещает подзапрос к началу

SELECT TOP(10) LocationId, 
     OverallSuitabilityScore, 
     RANK() OVER (ORDER BY OverallSuitabilityScore) AS OverallSuitabilityRank 
FROM 
(
    SELECT 
     Locations.LocationId, 
     dbo.Search_GetSuitability(@SearchPreferences, 
      Score.FieldA, Score.FieldB, Score.FieldC) AS OverallSuitabilityScore 
    FROM  dbo.LocationsView Locations 
    INNER JOIN dbo.LocationScores Score ON Locations.LocationId = Score.LocationId 
    WHERE  Locations.CityId = @LocationId 
) X 
+0

yep, это другой опция. +1 – RPM1984

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