Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
Привет всем ! Есть таблица, в которой храниться история значения объекта. Структура такая id date value good1 date1 value1 good1 date2 value2 ..... good1 dateN valueN good2 date1 value1 good2 date1 value1 ... goodn date1 value1 И Т.Д. Хочеться сформировать запрос, который бы выбирал только первые 5 значений для каждого товара.... Если есть возможность, киньте прибл. варианты решений или хотя бы в каком направлении думать. Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2002, 10:22 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
Если в результате надо получить первые (последние) 5 значение одного товара, то SELECT TOP 5 * FROM MyTable WHERE id='good1' ORDER BY date Если к ORDER BY добавить DESC, то получишь 5 последних (по времени) значений этого товара. Как это распространить на все товары я не знаю. Насколько я знаю, опция TOP влияет уже на результат выборки. Хотя, наверно можно поиграться с вложенными запросами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2002, 12:02 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
2ВладимирМ: Умен не по гадам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2002, 12:10 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
Воопче-то ВладимирМ отчасти прав - автора темы скорее всего спасет коррелированный подзапрос примерно такой конструкции (реальный пример, работающий на тестовой базе 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) Вот, надеюсь, дал досточно информации для направления мыслей в нужное русло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2002, 12:21 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
Базара нет, решение не лучшее, но тем не менее, катит. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2002, 12:30 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
2ReaperMan: Надо понимать, что ваше решение просто спекулирует на 2 вещах. 1. OderID - это целое число, растущее по мере появления Заказов. Но это легко поправить, упорядочив по полю OrderDate 2. OderID - ключ таблицы. Вот его-то и нет в нашем случае. Так что не катит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2002, 13:08 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
2 3.14_d'or: ИМХО автор темы позабыл самое главное упомянуть. Он сказал: > запрос, который бы выбирал только первые 5 значений для каждого товара.... совершенно забыв уточнить КАКИХ ИМЕННО первых пять значений (по дате, в порядке физического попадания в таблицу, еще по каким-то параметрам). Поэтому я всего лишь предложил примерное направление "копания". > Надо понимать, что ваше решение просто спекулирует на 2 вещах Я как бы решениями не спекулирую, а вот базировалось оно на следующих предпосылках: 1. В целевой таблице столбец GoodsID скорее всего является чьим-то FK, значения не уникальны ессно. 2. В данной табле д.б. какой-то PK, ну или еще какой то тот самый критерий, по которому мы будем отбирать первые пять записей. Согласись, без такого критерия постановка задачи бессмысленна. Так что в приведенном мной примере идеология именно такая. > OderID - ключ таблицы. Вот его-то и нет в нашем случае. В таблице нет ключа??? Гмммм... по ходу тогда автору надо просто слегонца пересмотреть свой подход к проектировке, РТФМом заняться и т.д. Не так ли? > Так что не катит. А вот катит или не катит - пусть скажет автор темы. К тому же мой запрос легко модифицируется под данную конкретную задачу, только поменяй поля a.EmployeeID -> a.GoodID, a.OrderID -> a.Date да подставь соответствующую таблу. Не так? Твое решение, кста, в случае семерки тоже не катит, ибо там нет типа данных table, AFAIK Хотя конечно можно выкрутиться на темптэйблах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2002, 05:44 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
Хело, пацаны 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. Я тебе не девочка, чтобы рожи в мессаге лепить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2002, 07:11 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
Привет! Спасибо всем,кто откликнулся... полная структура таблицы такая 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 большим специалистом по проектированию БД себя пока не считаю... Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2002, 07:33 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
Уважаемый 3.14_d'or! Простите за возможный "наезд", но как-то мы не привыкли в этом форуме к такой форме общения... Дело в том, что очень многие из здешних завсегдатаев и посетителей уже давно не "пацаны", а вполне солидные и уже (к сожалению) совсем не молодые люди... Мой Вам дружеский совет (уж простите, меня воспитывали ещё в стране советов) постарайтесь обращать на себя внимание не "оригинальным" стилем общения, а хорошим знанием предметной области, тем более, что знания у Вас действительно не плохие... С уважением, Зануда модератор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2002, 07:54 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
Попробуй так тогда (удалось заставить работать запрос 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2002, 08:04 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
2Александр Гладченко Намек понял. Базар буду фильтровать конкретнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2002, 08:34 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
Блин, не очень-то хочецца общаться с закомплексованными подростками с гипертрофированным ощущением собственной значимости, но таки постинг накорябаю. > Зачем катить на автора сабжа? Зачем незжать? Молодой человек, Вам с Вашей ущербной логикой и лексикой мешки разгружать ИМХО. На автора никто не катил. И он действительно подзабыл кое-чего уточнить. Где в его постинге указано, по какому критерию ему надо выбрать записи? Где написано "ПО ДАТЕ"? Или "ПО 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2002, 09:21 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
2 3.14_d'or: А то, что запрос ты таки сам до ума довел - молодец. Кроме шуток. З.Ы. Лана, поругались и будет. Хоть автору, надеюсь, помогли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2002, 09:24 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
2ReaperMan Трудно представить себе ситуацию, когда человек так может противоречить здравому смыслу, как ты щас. Я честно признал, что твой запрос (в том виде, что я сформировал) пашет, и пашет круче моего. Более того, я сразу пометил свой вариант как не оптимальный. Одним словом, надо найти в себе мужество и признать свои ошибки. Так вот, ты пишешь: >З.З.Ы. Добавлю, что приведенный запрос таки не очень-то совершенен, т.к. при наличии записей с одинаковыми ID и Date >для данного товара будет выбран вовсе не TOP 5... >Однако при наличии такой таблицы иметь составной ключ (ID, DATE, VALUE) - дурь несусветная, ибо ИМХО достаточно (ID, >VALUE). Логично, что в один момент време%E ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2002, 11:08 |
|
||
|
Проблема с запросом.... вернее с его реализацией....
|
|||
|---|---|---|---|
|
#18+
Логично, что в один момент времени (DATE) некий товар (ID) может иметь только одно значение (заданного) атрибута (VALUE)? Скажем, Автомобиль в некоем магазине в 12.10 5 Апреля 2002 года не может стоить одновременно $100 и $200. Не так ли? Думаю, так. Тогда твоя ситуация "наличии записей с одинаковыми ID и Date" возможна только в случае, если поле DATE хранит дату с малой точностью (smalldatetime, скажем) так, что изменения атрибута VALUE за некий промежуток времени соответствуют одной и той же комбинации ID и DATE. И ответь мне, какой же будет ключ тогда из (ID, DATE)? Думаю, ответ ясен - никакой. Я уже не говорю про то, что в один момент времени могут измениться два атрибута: скажем Цена и Количество. Вот и будет у тебя "ключ" с кучей поторяющихся записей... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2002, 11:10 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32026970&tid=1823217]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 366ms |

| 0 / 0 |
