2013-12-04 4 views
1

У меня есть следующий запрос, который хорошо работает в Oracle и DB2. Но он не работает в SQL Server 2008, потому что функция First_Value недоступна с тем же. Есть ли работа в 2008 году?Альтернатива для First_Value() в SQL Server 2008

select NameGuid, Name, AncestorGuid, ProductGuid, PathLength 
from (
    select 
    NameGuid, 
    Name, 
    AncestorGuid, 
    ProductGuid, 
    PathLength, 
    -- take every row from original query with the same Name as this, 
    -- order those rows by PathLength (and NameGuid to disambiguate) 
    -- and return the NameGuid of the first row in that "partition" 
    first_value(NameGuid) over (partition by Name order by PathLength asc, NameGuid asc) MinNameGuid 
    from ( 
     ... your original query ... 
    ) 
) 
where 
-- return rows whose NameGuid is the same as the NameGuid calculated by first_value(...) 
NameGuid = MinNameGuid 

Примечания: Запрос был ответ на мой предыдущий post

+1

Вы можете сделать что-то подобное с подзапросом и 'ROW_NUMBER()'. –

+0

Я попытался заменить first_value() на row_number(), но я получаю 'Ошибка в командной строке: 1 Столбец: 0 Отчет об ошибке: Ошибка SQL: предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах, и общие табличные выражения, если не указано значение TOP или FOR XML. ' – Firu

+0

Это не так просто - вам нужно вычислить row_number в подзапросе и присоединиться к этому. У меня нет полного ответа, но я подумал, что вы можете начать. –

ответ

0

Вы можете попробовать это в SQL Server 2008 для репликации First_Value функции

;with CTE(NameGuid, Name, AncestorGuid, ProductGuid, PathLength) AS 
(
    select 
    NameGuid, 
    Name, 
    AncestorGuid, 
    ProductGuid, 
    PathLength, 
-- take every row from original query with the same Name as this, 
-- order those rows by PathLength (and NameGuid to disambiguate) 
-- and return the NameGuid of the first row in that "partition" 
-- first_value(NameGuid) over (partition by Name order by PathLength asc, NameGuid asc) MinNameGuid 
ROW_NUMBER() over (partition by Name order by PathLength asc, NameGuid asc) MinNameGuid 
from ( 
    ... your original query ... 
)a 
) 
Select c.NameGuid, c.Name, c.AncestorGuid, c.ProductGuid, 
c.PathLength,c1.NameGUID 
from CTE c 
LEFT JOIN 
(SELECT NAMEGUID,Name from CTE where MinNameGuid = 1) C1 
on 
c.Name = C1.Name 
where c1.NAMEGUID is not NULL 

SQL FIDDLE DEMO

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