powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с запросом.... вернее с его реализацией....
16 сообщений из 16, страница 1 из 1
Проблема с запросом.... вернее с его реализацией....
    #32026951
Fred
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем !
Есть таблица, в которой храниться история значения объекта.
Структура такая
id date value
good1 date1 value1
good1 date2 value2
.....
good1 dateN valueN
good2 date1 value1
good2 date1 value1
...
goodn date1 value1

И Т.Д.

Хочеться сформировать запрос, который бы выбирал только первые 5 значений для каждого товара....
Если есть возможность, киньте прибл. варианты решений или хотя бы в каком направлении думать.

Заранее благодарен.
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32026970
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в результате надо получить первые (последние) 5 значение одного товара, то

SELECT TOP 5 * FROM MyTable WHERE id='good1' ORDER BY date

Если к ORDER BY добавить DESC, то получишь 5 последних (по времени) значений этого товара.

Как это распространить на все товары я не знаю. Насколько я знаю, опция TOP влияет уже на результат выборки. Хотя, наверно можно поиграться с вложенными запросами.
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32026972
3.14_d'or
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2ВладимирМ: Умен не по гадам.
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32026973
ReaperMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Воопче-то ВладимирМ отчасти прав - автора темы скорее всего спасет коррелированный подзапрос примерно такой конструкции (реальный пример, работающий на тестовой базе Northwind):

select a.EmployeeID, a.OrderID from Orders a
where a.OrderID in
(select top 5 b.OrderID
from Orders b
where b.EmployeeID = a.EmployeeID
order by b.OrderID)

Вот, надеюсь, дал досточно информации для направления мыслей в нужное русло
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32026974
3.14_d'or
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Базара нет, решение не лучшее, но тем не менее, катит.



create table #T (id char(100), [date] datetime, value char(100))
--
insert into #T values ('good1', getdate(), 'value1')
waitfor delay '000:00:01'
insert into #T values ('good1', getdate(), 'value2')
waitfor delay '000:00:01'
insert into #T values ('good1', getdate(), 'value3')
waitfor delay '000:00:01'
insert into #T values ('good1', getdate(), 'value4')
waitfor delay '000:00:01'
insert into #T values ('good1', getdate(), 'value5')
waitfor delay '000:00:01'
insert into #T values ('good1', getdate(), 'value6')
waitfor delay '000:00:01'
insert into #T values ('good2', getdate(), 'value1')
waitfor delay '000:00:01'
insert into #T values ('good2', getdate(), 'value2')
waitfor delay '000:00:01'
insert into #T values ('good3', getdate(), 'value1')
waitfor delay '000:00:01'
insert into #T values ('good3', getdate(), 'value2')
waitfor delay '000:00:01'
insert into #T values ('good3', getdate(), 'value3')
waitfor delay '000:00:01'
insert into #T values ('good3', getdate(), 'value4')
waitfor delay '000:00:01'
insert into #T values ('good3', getdate(), 'value5')
waitfor delay '000:00:01'
insert into #T values ('good3', getdate(), 'value6')
waitfor delay '000:00:01'
insert into #T values ('good4', getdate(), 'value1')


-- сам код
declare @t table (id char(100))
declare @id char(100)
declare @t2 table (id char(100), [date] datetime, value char(100))

insert @t select distinct id from #T
select @id = id from @t
while(exists(select 1 from @t))
begin
insert @t2 select top 5 * from #T where id = @id order by [date] desc
delete @t where id = @id
select @id = id from @t
end
-- результат
select * from @t2 order by id
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32026977
3.14_d'or
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2ReaperMan: Надо понимать, что ваше решение просто спекулирует на 2 вещах.

1. OderID - это целое число, растущее по мере появления Заказов. Но это легко поправить, упорядочив по полю OrderDate
2. OderID - ключ таблицы. Вот его-то и нет в нашем случае.

Так что не катит.
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32027010
ReaperMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 3.14_d'or:
ИМХО автор темы позабыл самое главное упомянуть. Он сказал:
> запрос, который бы выбирал только первые 5 значений для каждого товара....
совершенно забыв уточнить КАКИХ ИМЕННО первых пять значений (по дате, в порядке физического попадания в таблицу, еще по каким-то параметрам). Поэтому я всего лишь предложил примерное направление "копания".

> Надо понимать, что ваше решение просто спекулирует на 2 вещах
Я как бы решениями не спекулирую, а вот базировалось оно на следующих предпосылках:
1. В целевой таблице столбец GoodsID скорее всего является чьим-то FK, значения не уникальны ессно.
2. В данной табле д.б. какой-то PK, ну или еще какой то тот самый критерий, по которому мы будем отбирать первые пять записей. Согласись, без такого критерия постановка задачи бессмысленна.
Так что в приведенном мной примере идеология именно такая.

> OderID - ключ таблицы. Вот его-то и нет в нашем случае.
В таблице нет ключа??? Гмммм... по ходу тогда автору надо просто слегонца пересмотреть свой подход к проектировке, РТФМом заняться и т.д. Не так ли?

> Так что не катит.
А вот катит или не катит - пусть скажет автор темы. К тому же мой запрос легко модифицируется под данную конкретную задачу, только поменяй поля a.EmployeeID -> a.GoodID, a.OrderID -> a.Date да подставь соответствующую таблу. Не так?
Твое решение, кста, в случае семерки тоже не катит, ибо там нет типа данных table, AFAIK
Хотя конечно можно выкрутиться на темптэйблах.
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32027025
3.14_d'or
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хело, пацаны

2ReaperMan:

>ИМХО автор темы позабыл самое главное упомянуть. Он сказал:
>> запрос, который бы выбирал только первые 5 значений для каждого товара....
>совершенно забыв уточнить КАКИХ ИМЕННО первых пять значений (по дате, в порядке физического попадания в таблицу, еще по >каким-то параметрам). Поэтому я всего лишь предложил примерное направление "копания".

Зачем катить на автора сабжа? Зачем незжать?
Все просто и ясно сказано: три поля ID, DATE, VALUE. Даже данные приведены, где видны повторяющиеся значения
ID. Что за 5 записей - ежу ясно, что для каждого товара, имеющегося в таблице, вытянуть не более 5 записей, упорядочив по дате (самые свежие, логично).


>> Надо понимать, что ваше решение просто спекулирует на 2 вещах
>Я как бы решениями не спекулирую, а вот базировалось оно на следующих предпосылках:
>1. В целевой таблице столбец GoodsID скорее всего является чьим-то FK, значения не уникальны ессно.

Брат, это не целевая таблица. Не путай: это твоя таблица, которая к теме вопроса вабще не имеет отношения. потому как поля GoodsID нет в вопросе. Вникни в постановку задачи - у нас таблица Истории, а не таблица собственно сущностей. Понял?

>2. В данной табле д.б. какой-то PK, ну или еще какой то тот самый критерий, по которому мы будем отбирать первые пять >записей. Согласись, без такого критерия постановка задачи бессмысленна.

Опять смотри вопрос: ID, DATE, VALUE. Этого достаточно - зацени также предложенное мной решение (сравни исходную таблицу и результат выборки)

>Так что в приведенном мной примере идеология именно такая.

Да... Тебе бы только базарить, как посмотрю.



>> OderID - ключ таблицы. Вот его-то и нет в нашем случае.
>В таблице нет ключа??? Гмммм... по ходу тогда автору надо просто слегонца пересмотреть свой подход к проектировке, РТФМом >заняться и т.д. Не так ли?

Ключ, конечно, есть - он составной (ID, DATE, VALUE). Я имею ввиду, что нет ключа из одного поля, на чем и построен твой вариант. По ходу, пацан, ты слишком пригибаешь пипл.


>> Так что не катит.
>А вот катит или не катит - пусть скажет автор темы. К тому же мой запрос легко модифицируется под данную конкретную задачу, >только поменяй поля a.EmployeeID -> a.GoodID, a.OrderID -> a.Date да подставь соответствующую таблу. Не так?

Нарисуй, если не влом, заценим. А то трудно понять о чем речь: поля GoodID вообще-то нет. Есть ID.
Ну даже если так:

select a.ID, a.[DATE], a.value from #T a
where a.[DATE] in
(select top 5 b.[DATE]
from #T b
where b.ID = a.ID
order by b.[DATE] ASC)
ORDER BY a.[DATE] ASC

У меня никак не вышло получить список (для моих тестовых данных)
good1 2002-04-05 10:59:25.923 value6
good1 2002-04-05 10:59:24.907 value5
good1 2002-04-05 10:59:23.800 value4
good1 2002-04-05 10:59:22.800 value3
good1 2002-04-05 10:59:21.800 value2
good2 2002-04-05 10:59:27.923 value2
good2 2002-04-05 10:59:26.923 value1
good3 2002-04-05 10:59:33.923 value6
good3 2002-04-05 10:59:32.923 value5
good3 2002-04-05 10:59:31.923 value4
good3 2002-04-05 10:59:30.923 value3
good3 2002-04-05 10:59:29.923 value2
good4 2002-04-05 10:59:34.923 value1

А именно этот список нужен, как мне кажется. Или нет?

>Твое решение, кста, в случае семерки тоже не катит, ибо там нет типа данных table, AFAIK
>Хотя конечно можно выкрутиться на темптэйблах

Ну если 7, то да. Но кто говорил, что решение для 7? По умолчанию ориентируются на последнюю версию вабще-то.
Еще бы неплохо сказать, что оно не пашет на версии 6.5.

P.S. Я тебе не девочка, чтобы рожи в мессаге лепить.
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32027035
Fred
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
Спасибо всем,кто откликнулся...
полная структура таблицы такая
id ид товара (где то 26000
id_prop реквизит товара (напр. цена,таких реквизитов 5 )
date дата изменения реквизита
value значение реквизита

всего в таблице порядка 700 000 записей
сделал составной ключ id+id_prop+date
нужно отбирать последние по дате 5 записей по определенной группе товара и определенному реквизиту (например 5 последних изменений цены по каждому товару входящих в группу "Обои")
что сделал: выбираю из таблицы товары, удовлетворяющие вхождению в группу по определенному реквизиту, передаю в прикл. программу и там отбираю первые пять... процесс занимает порядка 40 сек. из них 14 сек. разбор в прикл. программе, остальное выполнение запроса и передача по сети... если запрос выполнять в Q-Analyzer то время выполнения 4 сек. я предположил что очень много времени занимает передача по сети, нужно сократить количество выбираемых записей...
2 3.14_d'or: предложенный вариант очень хороший, но на обработку уходит одного товара уходит 3 сек...а выборка по уникальным товарам состоит из 1400 записей..
Быть может действительно как то изменить структуру данных... что скажите гуру ?

P.S. 40 сек. много...
PP.S большим специалистом по проектированию БД себя пока не считаю...

Заранее благодарен.
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32027041
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый 3.14_d'or!
Простите за возможный "наезд", но как-то мы не привыкли в этом форуме к такой форме общения... Дело в том, что очень многие из здешних завсегдатаев и посетителей уже давно не "пацаны", а вполне солидные и уже (к сожалению) совсем не молодые люди... Мой Вам дружеский совет (уж простите, меня воспитывали ещё в стране советов) постарайтесь обращать на себя внимание не "оригинальным" стилем общения, а хорошим знанием предметной области, тем более, что знания у Вас действительно не плохие...

С уважением,

Зануда модератор.
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32027047
3.14_d'or
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй так тогда (удалось заставить работать запрос ReaperMan):


create table #T (id char(10), id_prop char(10), [date] datetime, value char(100))
--
insert into #T values ('good1', 'price', getdate(), 'value1')
waitfor delay '000:00:01'
insert into #T values ('good1', 'price', getdate(), 'value2')
waitfor delay '000:00:01'
insert into #T values ('good1', 'quantity', getdate(), 'value3')
waitfor delay '000:00:01'
insert into #T values ('good1', 'quantity', getdate(), 'value4')
waitfor delay '000:00:01'
insert into #T values ('good1', 'quantity', getdate(), 'value5')
waitfor delay '000:00:01'
insert into #T values ('good1', 'quantity', getdate(), 'value6')
waitfor delay '000:00:01'
insert into #T values ('good2', 'quantity', getdate(), 'value1')
waitfor delay '000:00:01'
insert into #T values ('good2', 'quantity', getdate(), 'value2')
waitfor delay '000:00:01'
insert into #T values ('good3','quantity', getdate(), 'value1')
waitfor delay '000:00:01'
insert into #T values ('good3', 'price', getdate(), 'value2')
waitfor delay '000:00:01'
insert into #T values ('good3', 'price', getdate(), 'value3')
waitfor delay '000:00:01'
insert into #T values ('good3', 'price', getdate(), 'value4')
waitfor delay '000:00:01'
insert into #T values ('good3', 'price', getdate(), 'value5')
waitfor delay '000:00:01'
insert into #T values ('good3', 'price', getdate(), 'value6')
waitfor delay '000:00:01'
insert into #T values ('good4', 'price', getdate(), 'value1')






-- Запрос a-la ReaperMan
select a.ID, a.id_prop, a.[DATE], a.value from #T a
where a.[DATE] in
(select top 5 b.[DATE]
from #T b
where b.ID = a.ID
AND b.id_prop = 'price'
order by b.[DATE] DESC
)
AND a.id_prop = 'price'
ORDER BY a.id, a.[DATE] DESC
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32027056
3.14_d'or
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Александр Гладченко

Намек понял. Базар буду фильтровать конкретнее.
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32027069
ReaperMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, не очень-то хочецца общаться с закомплексованными подростками с гипертрофированным ощущением собственной значимости, но таки постинг накорябаю.

> Зачем катить на автора сабжа? Зачем незжать?
Молодой человек, Вам с Вашей ущербной логикой и лексикой мешки разгружать ИМХО. На автора никто не катил. И он действительно подзабыл кое-чего уточнить. Где в его постинге указано, по какому критерию ему надо выбрать записи? Где написано "ПО ДАТЕ"? Или "ПО VALUE"? Может я это прошляпил, а?

> Что за 5 записей - ежу ясно, что для каждого товара, имеющегося в таблице, вытянуть не более 5 записей, упорядочив по дате
Я, к сожалению, не еж, поэтому адекватного с Вами общения у меня наверное не получится, извините. Про дату у автора ни слова.

> самые свежие, логично
Самые топовые (по Value), логично.

> Да... Тебе бы только базарить, как посмотрю.
Да, да, конечно...

> А то трудно понять о чем речь
Попробуй поменьше проводить времени в пустых базарах и побольше изучать хотя бы SQL-92. Тогда до тебя не будет доходить как до Штирлица письмо из Центра.

> У меня никак не вышло получить список (для моих тестовых данных)
Это вообще нонсенс. Ибо говорит даже не о кривизне рук, а просто не знаю о чем.

> А именно этот список нужен, как мне кажется. Или нет?
Или да. И именно он получается на твоих же тестовых данных при выполнении нижеприведенного запроса:
SELECT a.id, a.date, a.value FROM #T a
WHERE a.date IN
(SELECT DISTINCT TOP 5 b.date FROM #T b WHERE b.id = a.id ORDER BY b.date DESC)
ORDER by a.id ASC, a.date DESC

Да, и не будет ли так любезен многуважаемый гуру 3.14_d'or и не объяснит ли он специяльно для тупых, почему в его списке, который "должен был быть получен", даты отсортированы по убыванию, хотя в запросе стоит ASC?
Короче:
1. Бросайте курить траву, кушать грибы или чего у Вас там
2. "Учиться, учиться и еще раз учиться" как завещал великий Ленин.

З.Ы.
> P.S. Я тебе не девочка, чтобы рожи в мессаге лепить.
ROTFL. Без смайликов.
Спасибо, потешил старика.

З.З.Ы. Добавлю, что приведенный запрос таки не очень-то совершенен, т.к. при наличии записей с одинаковыми ID и Date для данного товара будет выбран вовсе не TOP 5... Однако при наличии такой таблицы иметь составной ключ (ID, DATE, VALUE) - дурь несусветная, ибо ИМХО достаточно (ID, VALUE).

З.З.З.Ы. Пока я тут по делам шатался да мессагу корябал, тебе вобщем-то уже все разжевали, неутомимый ты боец блин за справедливость. ROTFL again.
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32027071
ReaperMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 3.14_d'or:
А то, что запрос ты таки сам до ума довел - молодец. Кроме шуток.
З.Ы. Лана, поругались и будет. Хоть автору, надеюсь, помогли.
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32027080
3.14_d'or
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2ReaperMan

Трудно представить себе ситуацию, когда человек так может противоречить здравому смыслу, как ты щас.
Я честно признал, что твой запрос (в том виде, что я сформировал) пашет, и пашет круче моего. Более того,
я сразу пометил свой вариант как не оптимальный. Одним словом, надо найти в себе мужество и признать свои
ошибки.

Так вот, ты пишешь:

>З.З.Ы. Добавлю, что приведенный запрос таки не очень-то совершенен, т.к. при наличии записей с одинаковыми ID и Date
>для данного товара будет выбран вовсе не TOP 5...
>Однако при наличии такой таблицы иметь составной ключ (ID, DATE, VALUE) - дурь несусветная, ибо ИМХО достаточно (ID, >VALUE).

Логично, что в один момент време%E
...
Рейтинг: 0 / 0
Проблема с запросом.... вернее с его реализацией....
    #32027082
3.14_d'or
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Логично, что в один момент времени (DATE) некий товар (ID) может иметь только одно значение (заданного) атрибута (VALUE)?
Скажем, Автомобиль в некоем магазине в 12.10 5 Апреля 2002 года не может стоить одновременно $100 и $200. Не так ли?
Думаю, так. Тогда твоя ситуация "наличии записей с одинаковыми ID и Date" возможна только в случае, если поле DATE хранит
дату с малой точностью (smalldatetime, скажем) так, что изменения атрибута VALUE за некий промежуток времени соответствуют
одной и той же комбинации ID и DATE. И ответь мне, какой же будет ключ тогда из (ID, DATE)? Думаю, ответ ясен - никакой.

Я уже не говорю про то, что в один момент времени могут измениться два атрибута: скажем Цена и Количество. Вот и будет у
тебя "ключ" с кучей поторяющихся записей...
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с запросом.... вернее с его реализацией....
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]