Справка по RANK () через скалярную функцию - SQL Server 2008 - PullRequest
2 голосов
/ 21 января 2011

У меня есть следующая Встроенная табличная функция:

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() выдает мне ошибку:

Неверное имя столбца «ОбщийSuitabilityScore».

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

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

Что я могу сделать? Могу ли я использовать общее табличное выражение (CTE)?

Ответы [ 2 ]

4 голосов
/ 21 января 2011

Да, вы не можете ссылаться на псевдоним столбца в предложении 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   
2 голосов
/ 21 января 2011

Старый школьный способ сделать это - просто отправить выражение.CTE здесь только перемещает подзапрос на вершину

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...