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

Откуда:
Сообщений: 1196
Всем привет!
Есть такая таблица:

Id Value
1 2
1 3
1 4
2 5
2 6
2 7
3 8
3 9
3 10
4 8

Как мне получить 5 записей, чтобы в них было представлено каждое значение Id, т.е., к примеру
Id Value
1 2
1 3
2 5
3 8
4 8
или
Id Value
1 2
2 5
2 6
3 10
4 8

и т.п.?
10 апр 12, 16:48    [12394915]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
Glory
Member

Откуда:
Сообщений: 104751
Jovanny
чтобы в них было представлено каждое значение Id, т.е., к примеру

У вас Id повторяется
10 апр 12, 16:51    [12394937]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Glory
У вас Id повторяется


Так и должно быть. Это не первичный ключ. Главное условие - 5 строк, чтобы были представлены все Id.
10 апр 12, 16:53    [12394956]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
Glory
Member

Откуда:
Сообщений: 104751
Jovanny
ак и должно быть. Это не первичный ключ. Главное условие - 5 строк, чтобы были представлены все Id.

И как этот результат соответствует постановке "чтобы в них было представлено каждое значение Id" ?
10 апр 12, 16:54    [12394964]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
Jovanny
Member

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

Чтобы в результате встречались строки с Id=1,2,3,4 , неважно, в каком количестве с каким Id, но чтобы минимум одна строка для каждого Id.
10 апр 12, 16:56    [12394993]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
AmKad
Member

Откуда:
Сообщений: 5308
Jovanny
Glory
У вас Id повторяется

Так и должно быть. Это не первичный ключ. Главное условие - 5 строк, чтобы были представлены все Id.

Пример настолько частный
with s (id, val) as (
select 1,	2 union all
select 1,	3 union all
select 1,	4 union all
select 2,	5 union all
select 2,	6 union all
select 2,	7 union all
select 3,	8 union all
select 3,	9 union all
select 3,	10 union all
select 4,	8 )
select id, val
from
 (select s.*,
  row_number() over (partition by id order by val) rn
  from s
 )s
where rn = 1 or (id = 1 and rn = 2)
10 апр 12, 16:57    [12394997]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
Glory
Member

Откуда:
Сообщений: 104751
Jovanny
Чтобы в результате встречались строки с Id=1,2,3,4 , неважно, в каком количестве с каким Id, но чтобы минимум одна строка для каждого Id.

И чем это отличается от select * from mytable ?
Для каждого Id будет минимум одна строка
10 апр 12, 16:58    [12395007]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
Jovanny
Member

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

(id = 1 and rn = 2)


Возможных значений Id и количества строк с каждым Id мы наперёд не знаем.
10 апр 12, 17:01    [12395028]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
AmKad
Member

Откуда:
Сообщений: 5308
Jovanny
AmKad,

(id = 1 and rn = 2)


Возможных значений Id и количества строк с каждым Id мы наперёд не знаем.
Тогда откуда такое требование?
Jovanny
Как мне получить 5 записей, чтобы в них было представлено каждое значение Id


Модератор: Тема перенесена из форума "Microsoft SQL Server".


Сообщение было отредактировано: 10 апр 12, 17:03
10 апр 12, 17:03    [12395036]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Glory
И чем это отличается от select * from mytable ?
Для каждого Id будет минимум одна строка


Условие - TOP(5).
И в эти 5 строк должны быть добавлены записи с каждым Id. Если уникальных Id больше 5, то в выборке будет по одной записи на каждое значение Id, если меньше, то будет несколько записей с одинаковым Id.

На самом деле это эскиз задачи. Реально всё сложнее и количество записей несколько миллионов на 15 уникальных Id.
10 апр 12, 17:07    [12395067]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
AmKad
Member

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

select top 5 id, val
from s
order by row_number() over (partition by id order by val), id
10 апр 12, 17:13    [12395110]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
AmKad
Тогда откуда такое требование?
Jovanny
Как мне получить 5 записей, чтобы в них было представлено каждое значение Id


Модератор: Тема перенесена из форума "Microsoft SQL Server".


А что в этом необычного.

Для ясности могу описать суть задачи. Таблица - это список запросов к веб-сервисам.
Id - идентификатор веб-сервиса.
Запрос выбирает 100 задач за один раз, и желательно, чтобы они были для разных сервисов, а не все 100 для одного.
10 апр 12, 17:19    [12395141]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
AmKad
Jovanny,

select top 5 id, val
from s
order by row_number() over (partition by id order by val), id


Вот это уже что-то похожее. Спасибо, сейчас опробую на реальной задаче.
10 апр 12, 17:22    [12395155]     Ответить | Цитировать Сообщить модератору
 Re: Выборка  [new]
Jovanny
Member

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

Да, то, что надо! Спасибо!
10 апр 12, 17:31    [12395219]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить