|
|
|
Выборка последних записей в наборе
|
|||
|---|---|---|---|
|
#18+
Классическая задача: есть две таблицы: одна с перечнем товаров, другая с перечнем цен на эти товары. Цены могут меняться... Поэтому каждая цена имеет параметр "Дата начала действия" Цена может меняться максимум раз в день ( а может не меняться несколько месяцев), действует последняя цена перед конкретной датой. Задача: получить список товаров с действующей ценой на конкретную дату. Пока удалось сделать только через временную таблицу. Подскажите, как сделать попроще?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 13:42:51 |
|
||
|
Выборка последних записей в наборе
|
|||
|---|---|---|---|
|
#18+
Нельзя ли увидеть DDL для таблиц и то, что уже работает (через временные таблицы)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 14:56:03 |
|
||
|
Выборка последних записей в наборе
|
|||
|---|---|---|---|
|
#18+
Если я понял правильно, отношение между "Товары" и "Цены" - один ко многим, т.е. одной единице товара соответствует несколько цен, но только одна цена действующая - с самой "свежей" датой. Была у меня такая задача "Оборудование" имеющее несколько "Переключений" и нужно было вывести текущее состояние. Сделал я это запросом, работал секунд 20. Когда сделал процедурой с курсором - меньше секунды. Алгоритм примерно такой: 1) выбираешь в курсор связанные по ключу таблицы - особенность в сортировке: сортируешь по ключу и внутри ключа ("Цены") по убыванию даты. Таким образом внури набора записей с одним "Товаром" нужная запись с "Ценой" оказывается первой. 2) в один проход по курсору отбираешь "первые" записи во временную таблицу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 15:41:42 |
|
||
|
Выборка последних записей в наборе
|
|||
|---|---|---|---|
|
#18+
Пока удалось сделать только через временную таблицу. Подскажите, как сделать попроще?.. - обычно (по опыту) с временной таблицей почти всегда получается самое простое решение. - обычно (опять-же по опыту) использование временной таблицы почти всегда далеко не самый медленный способ. - SQL при выполнении сложных запросов тоже довольно активно использует временные таблицы, НО: какие именно как и когда решает оптимизатор, и его выбор не всегда лучший. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 16:11:41 |
|
||
|
Выборка последних записей в наборе
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 16:37:04 |
|
||
|
Выборка последних записей в наборе
|
|||
|---|---|---|---|
|
#18+
2 Vasya Вы можете еще добавить поле "Дата окончания действия", для последних записей ставьте туда заведомо большую дату. Тогда Вы сможете делать запрос без вложенных запросов и временных таблиц. Но появяться трудности с заполнением этого поля. Если Вы не хотите менять структуру таблицы, то к тому, что написал Hibernate, трудно что-то добавить. Избегайте по возможности вложенных запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 16:52:26 |
|
||
|
Выборка последних записей в наборе
|
|||
|---|---|---|---|
|
#18+
Добавлю к варианту предложенному SergSuper "Дату окончания действия" можно оставлять NULL для последней по времени цены. Тогда просто отбор тех цен где эта дата Is NULL. Или просто создать поле типа Bit для признака - последняя/не последняя цена ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 18:54:37 |
|
||
|
Выборка последних записей в наборе
|
|||
|---|---|---|---|
|
#18+
2jimmers, Dominic, Hibernate, SergSuper, ВладимирМ Попрошу мелкотемье и пустопорожье здесь не разводить. А то, небось, мой многогранник с четным числом ребер не по зубам оказался, а диалоги ламерские у вас - всегда, - пожалуйста. Совесть надо иметь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 19:50:05 |
|
||
|
Выборка последних записей в наборе
|
|||
|---|---|---|---|
|
#18+
2 ВладимирМ Не согласен я с Вашим добавлением. Null только добавит сложностей для выборки диапазонов(надо лишний раз будет писать isnull), а последние даты выбрать и так просто: where LastDate='20651031' (я в качесве заведомо большой даты всегда использую день когда мне будет 100 лет). И поле типа Bit совсем не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 09:53:03 |
|
||
|
Выборка последних записей в наборе
|
|||
|---|---|---|---|
|
#18+
Предвижу шумиху вокруг проблемы 2065 года - благодаря развитию медицины, я надеюсь, продолжительность жизни увеличится и SergSuper сам будет возглавлять комитет по ее решению - а я буду учавствовать в качесте консультанта по работе с древними SQL-серверами :-)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 11:44:11 |
|
||
|
Выборка последних записей в наборе
|
|||
|---|---|---|---|
|
#18+
А у меня работает примерно так: 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 - "отфонарно запрошенная" дата, по сост. на которую делается запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 13:22:37 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32034014&tid=1822147]: |
0ms |
get settings: |
9ms |
get forum list: |
8ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 291ms |
| total: | 408ms |

| 0 / 0 |
