Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите с запросом  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Всем доброго настроения.
есть запрос
declare @script_id bigint = 14;
with ste as(
select s.owner_id, 0 as lvl 
	from scripts.dependence_script s where s.dependence_id = @script_id
union all
select s.owner_id,lvl+1 as lvl 
	from ste ste
	join scripts.dependence_script s on s.dependence_id = ste.owner_id
)
select
ste.owner_id,ste.lvl,s.script_name from ste
join scripts.script s on s.script_id = ste.owner_id
group by ste.lvl,ste.owner_id,s.script_name
order by lvl desc
go
Он выдает такой результат

owner_id lvl script_name
-------------------- ----------- ----------------------------------------------------------------------------
29 3 dbatools_check_schema.sql
3 2 dbatools_sequence.sql
29 2 dbatools_check_schema.sql
3 1 dbatools_sequence.sql
5 1 dbatools_sp_add_sequence.sql
21 1 dbatools_v_index_for_services.sql
29 1 dbatools_check_schema.sql
2 0 dbatools_rep_service_index.sql
12 0 dbatools_sp_next_value_sequence.sql
22 0 dbatools_v_index_for_services_only_used.sql
29 0 dbatools_check_schema.sql
Мне надо получить результат следующего вида:

owner_id lvl script_name
-------------------- ----------- ----------------------------------------------------------------------------
29 3 dbatools_check_schema.sql
3 2 dbatools_sequence.sql
5 1 dbatools_sp_add_sequence.sql
21 1 dbatools_v_index_for_services.sql
2 0 dbatools_rep_service_index.sql
12 0 dbatools_sp_next_value_sequence.sql
22 0 dbatools_v_index_for_services_only_used.sql


Кроме как записать во временную таблицу, а потом выбрать distinct-ом по owner_id на ум нечего не приходит. Но тут тоже загвоздка, строки могу вернуться не в том порядке.
хотя вот этот запрос отрабатывает, но какой то он стремный, или мне просто кажется.
declare @script_id bigint = 14;
with ste as(
select s.owner_id, 0 as lvl 
	from scripts.dependence_script s where s.dependence_id = @script_id
union all
select s.owner_id,lvl+1 as lvl 
	from ste ste
	join scripts.dependence_script s on s.dependence_id = ste.owner_id
),
ste1 as(
select 
ste.owner_id,ste.lvl,s.script_name from ste
join scripts.script s on s.script_id = ste.owner_id
group by ste.lvl,ste.owner_id,s.script_name
)
select distinct ste1.owner_id,ste1.script_name from ste1
go
Сдам в ремонт свою крышу, чтоб больше не ехала, как у Чехова.
13 окт 11, 15:43    [11434941]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
gds,

вам нужно для каждого владельца оставить только один максимальный уровень? Используйте ROW_NUMBER() OVER(PARTITION BY owner_id ...) и фильтр по этому номеру.
13 окт 11, 15:56    [11435105]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
iljy
Используйте ROW_NUMBER() OVER(PARTITION BY owner_id ...)

Я уже думал об этом и раньше, но как то прикрутить не получается :(.
13 окт 11, 16:07    [11435225]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
iljy, в любом случае спасибо, буду думать как прикрутить...
13 окт 11, 16:08    [11435242]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
gds
iljy
Используйте ROW_NUMBER() OVER(PARTITION BY owner_id ...)

Я уже думал об этом и раньше, но как то прикрутить не получается :(.

А что именно не получается? Нумеруете строки внутри каждой группы как вам надо, потом оставляете только первые.
13 окт 11, 16:12    [11435297]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
iljy,

получилось :)
если кому интересно вот
+ скрипт
declare @script_id bigint = 14
;
with ste as(
select s.owner_id, 0 as lvl
from scripts.dependence_script s where s.dependence_id = @script_id
union all
select s.owner_id,lvl+1 as lvl
from ste ste
join scripts.dependence_script s on s.dependence_id = ste.owner_id
),
ste1 as(
select ROW_NUMBER() OVER(PARTITION BY owner_id order by lvl desc) as r,
ste.owner_id ,ste.lvl,s.script_name from ste
join scripts.script s on s.script_id = ste.owner_id
group by ste.lvl,ste.owner_id,s.script_name
)
select ste1.r,ste1.owner_id,ste1.script_name,ste1.lvl from ste1
where r = 1
order by lvl desc
go

Проблема была в определении по какому полю сортировать и выбора условия фильтрации...
ROW_NUMBER() OVER(PARTITION BY owner_id order by lvl desc) as r
where r = 1
Честно говоря не сразу додумался.

iljy, еще раз спасибо.
Вопрос закрыт.
13 окт 11, 16:27    [11435499]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить