Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка последних записей в наборе / 11 сообщений из 11, страница 1 из 1
26.06.2002, 13:42:51
    #32033972
Vasya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка последних записей в наборе
Классическая задача: есть две таблицы: одна с перечнем товаров, другая с перечнем цен на эти товары. Цены могут меняться... Поэтому каждая цена имеет параметр "Дата начала действия" Цена может меняться максимум раз в день ( а может не меняться несколько месяцев), действует последняя цена перед конкретной датой. Задача: получить список товаров с действующей ценой на конкретную дату. Пока удалось сделать только через временную таблицу. Подскажите, как сделать попроще?..
...
Рейтинг: 0 / 0
26.06.2002, 14:56:03
    #32033992
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка последних записей в наборе
Нельзя ли увидеть DDL для таблиц и то, что уже работает (через временные таблицы)?
...
Рейтинг: 0 / 0
26.06.2002, 15:41:42
    #32034000
Dominic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка последних записей в наборе
Если я понял правильно, отношение между "Товары" и "Цены" - один ко многим, т.е. одной единице товара соответствует несколько цен, но только одна цена действующая - с самой "свежей" датой.
Была у меня такая задача "Оборудование" имеющее несколько "Переключений" и нужно было вывести текущее состояние. Сделал я это запросом, работал секунд 20. Когда сделал процедурой с курсором - меньше секунды.
Алгоритм примерно такой:

1) выбираешь в курсор связанные по ключу таблицы - особенность в сортировке: сортируешь по ключу и внутри ключа ("Цены") по убыванию даты. Таким образом внури набора записей с одним "Товаром" нужная запись с "Ценой" оказывается первой.
2) в один проход по курсору отбираешь "первые" записи во временную таблицу
...
Рейтинг: 0 / 0
26.06.2002, 16:11:41
    #32034005
Hibernate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка последних записей в наборе
Пока удалось сделать только через временную таблицу. Подскажите, как сделать попроще?..

- обычно (по опыту) с временной таблицей почти всегда получается самое простое решение.

- обычно (опять-же по опыту) использование временной таблицы почти всегда далеко не самый медленный способ.

- SQL при выполнении сложных запросов тоже довольно активно использует временные таблицы, НО: какие именно как и когда решает оптимизатор, и его выбор не всегда лучший.
...
Рейтинг: 0 / 0
26.06.2002, 16:37:04
    #32034011
D
D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка последних записей в наборе
Код: plaintext
1.
2.
3.
4.
5.
select i.item,p.price
from tbl_price p inner join tbl_item i
on p.item=i.item
and p.from_date=(select max(from_date) 
                 from tbl_price t 
                 where t.from_date<=getdate() and  t.item=p.item)
...
Рейтинг: 0 / 0
26.06.2002, 16:52:26
    #32034014
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка последних записей в наборе
2 Vasya
Вы можете еще добавить поле "Дата окончания действия", для последних записей ставьте туда заведомо большую дату. Тогда Вы сможете делать запрос без вложенных запросов и временных таблиц. Но появяться трудности с заполнением этого поля. Если Вы не хотите менять структуру таблицы, то к тому, что написал Hibernate, трудно что-то добавить. Избегайте по возможности вложенных запросов.
...
Рейтинг: 0 / 0
26.06.2002, 18:54:37
    #32034048
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка последних записей в наборе
Добавлю к варианту предложенному SergSuper

"Дату окончания действия" можно оставлять NULL для последней по времени цены. Тогда просто отбор тех цен где эта дата Is NULL.

Или просто создать поле типа Bit для признака - последняя/не последняя цена
...
Рейтинг: 0 / 0
26.06.2002, 19:50:05
    #32034053
RatTail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка последних записей в наборе
2jimmers, Dominic, Hibernate, SergSuper, ВладимирМ
Попрошу мелкотемье и пустопорожье здесь не разводить.
А то, небось, мой многогранник с четным числом ребер не по зубам оказался,
а диалоги ламерские у вас - всегда, - пожалуйста.
Совесть надо иметь.
...
Рейтинг: 0 / 0
27.06.2002, 09:53:03
    #32034091
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка последних записей в наборе
2 ВладимирМ

Не согласен я с Вашим добавлением. Null только добавит сложностей для выборки диапазонов(надо лишний раз будет писать isnull), а последние даты выбрать и так просто: where LastDate='20651031' (я в качесве заведомо большой даты всегда использую день когда мне будет 100 лет). И поле типа Bit совсем не надо.
...
Рейтинг: 0 / 0
27.06.2002, 11:44:11
    #32034102
JINX
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка последних записей в наборе
Предвижу шумиху вокруг проблемы 2065 года - благодаря развитию медицины, я надеюсь, продолжительность жизни увеличится и SergSuper сам будет возглавлять комитет по ее решению - а я буду учавствовать в качесте консультанта по работе с древними SQL-серверами :-))
...
Рейтинг: 0 / 0
27.06.2002, 13:22:37
    #32034119
AndreK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка последних записей в наборе
А у меня работает примерно так:
SELECT * FROM remont
WHERE ((STR(ele) + '_' + CONVERT(char(23), d_otkl))= ANY (SELECT str(ele) + '_' + CONVERT(char(23), MAX(d_otkl))
FROM remont WHERE d_otkl <= @d GROUP BY ele))
где ele - товар,
d_otkl - Ваша дата начала действия цены каждого товара
@d - "отфонарно запрошенная" дата, по сост. на которую делается запрос.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка последних записей в наборе / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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