Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вхождение в select top всех записей со значениями из указанного набора  [new]
TOP N
Guest
Нужно, чтобы выборка по top N содержала все значения поля из указанного набора. Что-то типа
select top 20 n,name, status from mytable where status in (1,2,3)
- чтобы в выбранных 20 записях обязательно были записи со status=1, status=2, status=3 ("типа" - потому что такой селект не работает, он выбирает 20 записей со статусом 1, и все). Разумеется, число значений в наборе меньше или равно числу, указанному в top. Порядок следования записей неважен. Спасибо.
2 мар 12, 08:26    [12180933]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в select top всех записей со значениями из указанного набора  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
мне кажется не лучший подход, но все-же
declare @t table (i int)

insert into @t(i) values
(1),
(1),
(2),
(2),
(2),
(3),
(4),
(5),
(6),
(7)


select top 5
	t.i	
from
	@t t
where
	t.i in (1, 2, 3)
order by
	row_number() over (partition by t.i order by t.i)
2 мар 12, 08:37    [12180955]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в select top всех записей со значениями из указанного набора  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
select top 20 * 
  from mytable t
    pivot ( count(status) for status in ( [1],[2],[3] ) ) pv
  where [1] > 0 
    and [2] > 0
    and [3] > 0
2 мар 12, 08:45    [12180973]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в select top всех записей со значениями из указанного набора  [new]
TOP N
Guest
Knyazev Alexey
select top 20 * 
  from mytable t
    pivot ( count(status) for status in ( [1],[2],[3] ) ) pv
  where [1] > 0 
    and [2] > 0
    and [3] > 0

Пустая выборка получается:
;with cte as (
  select top (select 100) percent number n, char(number+33) st, dateadd(DD, number, getdate()) dt, number%5+1 status
    from master..spt_values where type='P' and number between 0 and 50 order by CHECKSUM(NEWID())
)
select top 10 * from cte t
pivot (count(status) for status in ([1],[2],[3])) pv
where [1]>0 and [2]>0 and [3]>0
2 мар 12, 09:32    [12181121]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в select top всех записей со значениями из указанного набора  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Не понимаю тогда условий вашей задачи...вам, что нужно-то?
Объясните!
2 мар 12, 09:37    [12181137]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в select top всех записей со значениями из указанного набора  [new]
TOP N
Guest
Knyazev Alexey,

Нужна выборка размером N записей, и чтобы в ней обязательно присутствовали записи со значениями поля из указанного набора значений (с каждым значением из набора).
2 мар 12, 09:40    [12181153]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в select top всех записей со значениями из указанного набора  [new]
TOP N
Guest
Что-то типа такого:
;with cte as (
  select top (select 100) percent number n, char(number+33) st, dateadd(DD, number, getdate()) dt, number%5+1 status, number%5+1 status2
    from master..spt_values where type='P' and number between 0 and 50 order by CHECKSUM(NEWID())
),
cte2 as (
  select top 1 * from cte where status=1
  union all
  select top 1 * from cte where status=2
  union all
  select top 1 * from cte where status=3
  union all
  select * from cte
)
select top 10 * from cte2 t

- только не нравится решение через union all
2 мар 12, 09:58    [12181251]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в select top всех записей со значениями из указанного набора  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
TOP N
Knyazev Alexey,

Нужна выборка размером N записей, и чтобы в ней обязательно присутствовали записи со значениями поля из указанного набора значений (с каждым значением из набора).
Но пойму, а чем вариант HandKot не подходит?
2 мар 12, 10:10    [12181303]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в select top всех записей со значениями из указанного набора  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
У вас в таблице 100 записей со status=1, 100 - со status=2, 100 - со status=3. "select top 20" должен вернуть:
1) 18 записей status=1, 1 запись status = 2, 1 запись status = 3;
или
2) 7 записей status=1, 7 записей status = 2, 6 записей status = 3;
или
3)
как-то ещё?
2 мар 12, 10:13    [12181330]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить