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

Откуда:
Сообщений: 1684
Входные данные - 2 таблицы: Sales (ids, amount, ...), Rules (idr, priority, percents, ...).

Задача - Необходимо выбрать правило (полная запись из Rules, т.е. включая все поля) для данной покупки, которое имеет наибольший приоритет, затем на основании этого правила проупдэйтить покупку.

Условия -
1)Одной продаже может соответствовать несколько правил,
2)У нескольких правил может быть одинаковый приоритет,
3)Результат "Покупка+Подходящее правило" выводить через вьюху (т.е. SELECT ids, amount, priority, percent FROM SALES_VIEW)
4)При упдэйте желательно пользоваться таким способом:
UPDATE Sales
SET amount = sv.amount*sv.percents, ...
FROM SALES_VIEW sv,...
WHERE id = sv.id AND ...
17 авг 11, 15:15    [11133741]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Glory
Member

Откуда:
Сообщений: 104751
И что у вас из этого не получилось ?
17 авг 11, 15:17    [11133763]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Антохин
Member

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

Лушче начну с того что получилось)

Сделал вьюху, которая выводит полный список Покупка+Правило (но без учёта приоритета, его я не могу запихнуть в условие выборки...).
Как понимаете order by не работает, если использовать
group by priority
having  min(priority)=priority
то он выводит весь список совпадений, точно такой же как и без having.
17 авг 11, 15:23    [11133824]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Glory
Member

Откуда:
Сообщений: 104751
Антохин
Сделал вьюху, которая выводит полный список Покупка+Правило (но без учёта приоритета, его я не могу запихнуть в условие выборки...).

Вопрос с задача выбрать одну запись из группы на форуме задается регулярно. Иногда по нескольку раз за один день
17 авг 11, 15:25    [11133842]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Антохин,

если версия сервера > 2000, почитайте про select top 1 with ties ...order by row_number()...
если нет, то сначала выполняете группировку и поиск максимального приоритета, потом присоединяете подзапрос к таблице правил для получения полей не входящих в группировку.
17 авг 11, 15:26    [11133851]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Антохин
Member

Откуда:
Сообщений: 1684
SomewhereSomehow
Антохин,

если версия сервера > 2000, почитайте про select top 1 with ties ...order by row_number()...
если нет, то сначала выполняете группировку и поиск максимального приоритета, потом присоединяете подзапрос к таблице правил для получения полей не входящих в группировку.

Версия 2005, но как я написал выше - выборку необходимо организовать во вьюхе, а во вьюхах ORDER BY не катит.
Читал про TIES здесь
17 авг 11, 15:32    [11133932]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SomewhereSomehow
Антохин,

если версия сервера > 2000, почитайте про select top 1 with ties ...order by row_number()...
если нет, то сначала выполняете группировку и поиск максимального приоритета, потом присоединяете подзапрос к таблице правил для получения полей не входящих в группировку.
Антохин
У нескольких правил может быть одинаковый приоритет
Наверно, RANK()?

Только непонятно, что имеется в виду под "проапдейтить" для случая нескольких правил с одинаковым приоритетом
Если просто перемножить, это одно, а если результат зависит от порядка применения правил, то это совсем другое
17 авг 11, 15:33    [11133940]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Антохин
SomewhereSomehow
Антохин,

если версия сервера > 2000, почитайте про select top 1 with ties ...order by row_number()...
если нет, то сначала выполняете группировку и поиск максимального приоритета, потом присоединяете подзапрос к таблице правил для получения полей не входящих в группировку.

Версия 2005, но как я написал выше - выборку необходимо организовать во вьюхе, а во вьюхах ORDER BY не катит.
Читал про TIES здесь
Катит, если вместе с TOP
17 авг 11, 15:33    [11133949]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Антохин
Member

Откуда:
Сообщений: 1684
Glory
Антохин
Сделал вьюху, которая выводит полный список Покупка+Правило (но без учёта приоритета, его я не могу запихнуть в условие выборки...).

Вопрос с задача выбрать одну запись из группы на форуме задается регулярно. Иногда по нескольку раз за один день

Вот здесь не указана ссылка на данный тип вопроса, потому я и не мог знать что его поднимают часто, киньте плиз ссылку на решённый топик.
17 авг 11, 15:34    [11133955]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Glory
Member

Откуда:
Сообщений: 104751
Антохин
Вот здесь не указана ссылка на данный тип вопроса, потому я и не мог знать что его поднимают часто, киньте плиз ссылку на решённый топик.

просмотрите хотя бы темы на первой странице форума
17 авг 11, 15:35    [11133971]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Антохин
Glory
пропущено...

Вопрос с задача выбрать одну запись из группы на форуме задается регулярно. Иногда по нескольку раз за один день

Вот здесь не указана ссылка на данный тип вопроса, потому я и не мог знать что его поднимают часто, киньте плиз ссылку на решённый топик.
Вон там, наверху, есть кнопка FAQ
17 авг 11, 15:36    [11133984]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Антохин
Member

Откуда:
Сообщений: 1684
iap
Антохин
пропущено...

Версия 2005, но как я написал выше - выборку необходимо организовать во вьюхе, а во вьюхах ORDER BY не катит.
Читал про TIES здесь
Катит, если вместе с TOP

Сделал так
SELECT top 100 percent with ties
r.priority
FROM SALES s, Rules r
WHERE ...--(20 строк условий)
order by r.priority
вывел такой результат:
500
479
480

Что сделал не так?
17 авг 11, 15:37    [11133991]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Glory
Member

Откуда:
Сообщений: 104751
Антохин
Что сделал не так?

Почему то придумали, что "а во вьюхах ORDER BY не катит"
17 авг 11, 15:39    [11134017]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Антохин,

там не просто ордер бай, там еще топ, пример
use tempdb
go
create table  Rules (idr int, priority int, percents int)
go
insert into Rules select 1,1,0
insert into Rules select 1,2,0
insert into Rules select 2,1,0
insert into Rules select 2,2,0
go
create view HighPriorityRules
as
select top (1) with ties
	idr,
	priority,
	percents
from
	Rules
order by
	row_number() over (partition by idr order by priority desc)
go
select * from HighPriorityRules
go
drop table Rules
drop view HighPriorityRules

iap
Наверно, RANK()?

имхо, все же row_number(), т.к. будет выбираться строго одна строка для одного правила (вроде автор там что-то обновлять собрался?), только нужно задать правильно правила сортировки для случая когда приоритеты одинаковые, определить какой следующий критерий выбора правила...
17 авг 11, 15:41    [11134029]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
igor2222
Member

Откуда: Харків
Сообщений: 1233
Антохин
Что сделал не так?

row_number потерялся
17 авг 11, 15:42    [11134032]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Антохин
Member

Откуда:
Сообщений: 1684
Glory
Антохин
Что сделал не так?

Почему то придумали, что "а во вьюхах ORDER BY не катит"

ну видимо я в order by вкладываю немного иной смысл)
order by используется для сортировки в общем случае, а во вьюхах -
автор
Предложение ORDER BY используется в определении представления только для упорядочивания строк, возвращаемых предложением TOP. Предложение ORDER BY не гарантирует упорядочивания результатов при запросе к представлению, если оно не указано в самом запросе.

Источник
17 авг 11, 15:45    [11134056]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Антохин
iap
пропущено...
Катит, если вместе с TOP

Сделал так
SELECT top 100 percent with ties
r.priority
FROM SALES s, Rules r
WHERE ...--(20 строк условий)
order by r.priority
вывел такой результат:
500
479
480

Что сделал не так?
В версиях >=2005 TOP 100 PERCENT ИГНОРИРУЕТСЯ сервером.
Но Вам-то надо TOP(1), а не TOP 100 PERCENT!
17 авг 11, 15:49    [11134085]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Антохин
Member

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

Вот что у меня получилось:
17 авг 11, 15:52    [11134113]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Антохин
Member

Откуда:
Сообщений: 1684
Антохин
SomewhereSomehow,

Вот что у меня получилось:

Блин, глюкнул предварительный просмотр.
17 авг 11, 15:52    [11134120]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Антохин
Member

Откуда:
Сообщений: 1684
Антохин
Антохин
SomewhereSomehow,

Вот что у меня получилось:

Блин, глюкнул предварительный просмотр.

а сейчас промазал по кнопке)))

К сообщению приложен файл. Размер - 65Kb
17 авг 11, 15:52    [11134123]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Антохин
Member

Откуда:
Сообщений: 1684
просмотр FAQ не помогло.

SomewhereSomehow,

Быть может что-то ты написал не так?
Почему две то строчки вернулось???
да и на моей выборке возвращаются все строчки, а не 1.
17 авг 11, 16:20    [11134310]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Антохин
Member

Откуда:
Сообщений: 1684
Антохин
просмотр FAQ не помогло.

SomewhereSomehow,

Быть может что-то ты написал не так?
Почему две то строчки вернулось???
да и на моей выборке возвращаются все строчки, а не 1.

А именно делал так:
SELECT  top (1) with ties
r.priority
FROM SALES s, Rules r
WHERE ...--(20 строк условий)
order by
row_number() over (partition by r.idr  order by r.priority )
17 авг 11, 16:22    [11134318]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Антохин
Member

Откуда:
Сообщений: 1684
Антохин
Антохин
просмотр FAQ не помогло.

SomewhereSomehow,

Быть может что-то ты написал не так?
Почему две то строчки вернулось???
да и на моей выборке возвращаются все строчки, а не 1.

А именно делал так:
SELECT  top (1) with ties
r.priority
FROM SALES s, Rules r
WHERE ...--(20 строк условий)
order by
row_number() over (partition by r.idr  order by r.priority )


Ух ты!
Нашёл что не так)))
Вместо
order by
row_number() over (partition by r.idr  order by r.priority )
Нужно
order by
row_number() over (order by r.priority )

Помогла ещё справочка
17 авг 11, 16:25    [11134339]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Антохин
просмотр FAQ не помогло.

SomewhereSomehow,

Быть может что-то ты написал не так?
Почему две то строчки вернулось???
да и на моей выборке возвращаются все строчки, а не 1.


Ну, а вы проанализируйте, что именно за строчки вернулись, не те ли которые соответвуют строчкам с максимальным приоритетом в таблице правил для каждого из значений idr. Не это разве надо было получить во вьюхе?

Антохин
Нужно
order by
row_number() over (order by r.priority )

и что это будет? вам что, одну строку надо из всей таблицы правил? в таком случае, это правило будет соответвовать всем продажам? или все-таки у каждой продажи свой набор правил и нужно получить правило с максимальным приоритетом в рамках каждой продажи?
17 авг 11, 16:33    [11134400]     Ответить | Цитировать Сообщить модератору
 Re: "Олимпиадная задачка" про выборку по приоритету  [new]
Антохин
Member

Откуда:
Сообщений: 1684
SomewhereSomehow
Антохин
просмотр FAQ не помогло.

SomewhereSomehow,

Быть может что-то ты написал не так?
Почему две то строчки вернулось???
да и на моей выборке возвращаются все строчки, а не 1.


Ну, а вы проанализируйте, что именно за строчки вернулись, не те ли которые соответвуют строчкам с максимальным приоритетом в таблице правил для каждого из значений idr. Не это разве надо было получить во вьюхе?

Антохин
Нужно
order by
row_number() over (order by r.priority )

и что это будет? вам что, одну строку надо из всей таблицы правил? в таком случае, это правило будет соответвовать всем продажам? или все-таки у каждой продажи свой набор правил и нужно получить правило с максимальным приоритетом в рамках каждой продажи?

Ну если
insert into Rules select 1,1,0
insert into Rules select 1,2,0
insert into Rules select 2,1,0
insert into Rules select 2,2,0
это имитация двух таблиц, где id = ids, то да, всё верно.
Но я смотрел на эту таблицу только лишь как на таблицу правил, без учёта продаж.

тогда необходим такой код
use tempdb
go
create table  Rules (idr int, priority int, percents int)
go
insert into Rules select 1,1,2
insert into Rules select 2,2,2
insert into Rules select 3,1,3
insert into Rules select 4,2,4
go

create table  Sales (ids int, amount int)
go
insert into Sales select 1,2
insert into Sales select 2,2
insert into Sales select 3,3
insert into Sales select 4,4
insert into Sales select 5,2
insert into Sales select 6,4
go

create view HighPriorityRules
as
select top (1) with ties
	r.idr,
	r.priority,
	r.percents,
	s.ids,
	s.amount
from
	Rules r, sales s
where r.percents = s.amount
order by
	row_number() over (partition by s.ids order by r.priority desc)
go
select * from HighPriorityRules
go
drop table Rules
drop table Sales
drop view HighPriorityRules
18 авг 11, 07:20    [11136904]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить