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

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

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

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

- SQL при выполнении сложных запросов тоже довольно активно использует временные таблицы, НО: какие именно как и когда решает оптимизатор, и его выбор не всегда лучший.
...
Рейтинг: 0 / 0
Выборка последних записей в наборе
    #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
Выборка последних записей в наборе
    #32034014
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Vasya
Вы можете еще добавить поле "Дата окончания действия", для последних записей ставьте туда заведомо большую дату. Тогда Вы сможете делать запрос без вложенных запросов и временных таблиц. Но появяться трудности с заполнением этого поля. Если Вы не хотите менять структуру таблицы, то к тому, что написал Hibernate, трудно что-то добавить. Избегайте по возможности вложенных запросов.
...
Рейтинг: 0 / 0
Выборка последних записей в наборе
    #32034048
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавлю к варианту предложенному SergSuper

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

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

Не согласен я с Вашим добавлением. Null только добавит сложностей для выборки диапазонов(надо лишний раз будет писать isnull), а последние даты выбрать и так просто: where LastDate='20651031' (я в качесве заведомо большой даты всегда использую день когда мне будет 100 лет). И поле типа Bit совсем не надо.
...
Рейтинг: 0 / 0
Выборка последних записей в наборе
    #32034102
JINX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предвижу шумиху вокруг проблемы 2065 года - благодаря развитию медицины, я надеюсь, продолжительность жизни увеличится и SergSuper сам будет возглавлять комитет по ее решению - а я буду учавствовать в качесте консультанта по работе с древними SQL-серверами :-))
...
Рейтинг: 0 / 0
Выборка последних записей в наборе
    #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
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка последних записей в наборе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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