|
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 25
|
||||||
Отбор макс. значений из таблицы26.12.2019, 11:03. Показов 1696. Ответов 13
Здравствуйте, форумчане!
Есть таблица с полями Номенклатура, ДатаПокупки, Цена. Первичного ключа нет, значения в полях Номенклатура и ДатаПокупки могут повторяться. Надо, ориентируясь на дату покупки, отобрать самые последние цены. Вот как я это сделал:
Подскажите, пожалуйста. Заранее благодарен.
0
|
||||||
| 26.12.2019, 11:03 | |
|
Ответы с готовыми решениями:
13
Отбор в таблице значений по условию четных и нечетных значений Как установить отбор для поля таблицы по другому полю той же таблицы реквизитов связанных через регистр сведений отбор значений |
| 26.12.2019, 11:08 | ||||||
|
можно так
1
|
||||||
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
|
| 26.12.2019, 11:51 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 25
|
|||||||||||
| 26.12.2019, 13:29 [ТС] | |||||||||||
|
qwertehok, спасибо за оперативный ответ.
Хочу поделиться с вами результатами. Может быть это будет для вас интересно. Сравнил оба варианта - мой приблизительно на треть быстрее. Правда результирующий набор всего 150000 записей, а исходный около 600 тысяч, так что о быстродействии судить можно весьма условно. В вашем варианте заменил group by на distinct - ничего по времени не дало. А вот замена outer на cross сравняла наши варианты по быстродействию. Cross работает быстрее и в данном случае как раз годится, поскольку "табличная функция" (второй селект) всегда гарантированно возвращает одну запись. Я ничего не сообщил об условиях отбора данных. На самом деле они есть:
При этом ваш вариант начинает проигрывать в быстродействии, потому что у вас получаются два селекта с условием, а у меня - один. Но эстетически ваш вариант мне нравится больше. Ещё раз спасибо. Добавлено через 24 минуты invm, совершенно верно подметили. Крайне редко (на моих данных), но может случиться вот такая вот картина: Ном1 Дата1 Цена1 Ном1 Дата1 Цена2 Ном1 Дата1 Цена3 Ном2 Дата5 Цена5 ... И distinct в данном случае не спасает. Я закрываю на это глаза. Можно было бы добавить ещё один внешний селект:
- заказчик сам не знает, какую цену в данном случае брать, - меньшую, большую, среднюю; - результат отбора используется в последующих сложных расчётах, где и можно принять решение как поступить. P.S. Кстати, в варианте qwertehok дублирования, подобного указанному выше, нет, что хорошо, но цена всё равно возвращается как бог на душу положит.
0
|
|||||||||||
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
||||||||
| 26.12.2019, 13:42 | ||||||||
|
Пробуйте так
1
|
||||||||
|
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 25
|
||||||
| 26.12.2019, 14:51 [ТС] | ||||||
|
invm, спасибо за ваше участие, вы всегда помогаете.
Вы удивляетесь моему рассказу о быстродействии. Да, объёмы не те, на которых можно что-то сравнить, всё очень приблизительно. Тем не менее я говорю о том, что вижу своими глазами... Вы пишите "Distinct и есть group by в большинстве случаев." Я же всегда придерживаюсь правила не применять, если не надо, избыточного по мощности инструментария. Что касается индексов, то на номенклатуру и дату они разумеется есть. А вот поля КодФирмы и КодСклада не проиндексированы, потому что значения этих полей имеют очень низкую селективность и их индексирование практически ничего не даёт, кроме увеличения объема. Ваш вариант с row_number() прекрасен, я его тоже имел в виду, но всё значительно сложнее того, о чём я написал. Я просто упростил задачу до максимума, чтобы сильно не нагружать коллег по профессии своими проблемами. Дело в том, что последнюю цену надо найти не в одной таблице, а в трёх. Вот реальный фрагмент процедуры, готовящей таблицу заказов:
Р_ЗаказатьНаЕП - 5503, Остатки - 136471, Заказы - 530096, Поставки - 587433 Время выполнения фрагмента - 2 сек. (то, что рисует SQL). Работаю удалённо, на каких мощностях - представления не имею. Время меня устраивает. Не устраивает громоздкость этой конструкции. Спасибо вам, invm, за "разбор полётов".
0
|
||||||
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
|||
| 26.12.2019, 15:05 | |||
|
Какой именно нужен индекс для данного запроса я уже писал. Как сделать быстро я тоже уже писал. Ничего не мешает оформить это как представления для трех таблиц. И в итоговом запросе работать с этими представлениями.
1
|
|||
|
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 25
|
||||||
| 26.12.2019, 16:05 [ТС] | ||||||
|
Что distinct по всем столбцам, что group by по тем же столбцам, если надо получить уникальные записи. Только group by позволяет ещё что-то сделать с данными, попавшими в группу. Но если не нужно ничего делать с данными группы, а лишь отобрать уникальные значения - зачем использовать group by?
раз выполнялся бы поиск, то конечно надо было создать по максимуму индексы, ускоряющие отбор данных. Но особенность моей БД в том, что она загружается один раз ночью. После этого однократно выполняются массовые расчёты (по модели управления запасами) и на этом всё заканчивается. То есть затраты на индексирование при загрузке БД могут превосходить выигрыш в быстродействии при одном (двух) считывании данных из соответствующей таблицы.
0
|
||||||
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
||||
| 26.12.2019, 16:55 | ||||
|
Я говорю, что физически distinct раскрывается либо в group by, либо в distinct sort. Поэтому бессмысленно сравнивать производительность dustinct и group by.
1
|
||||
|
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 25
|
|||||||
| 26.12.2019, 18:32 [ТС] | |||||||
|
CTE использовать не могу, уже есть в процедуре. Перешёл на row_number(), работает немного быстрее:
Спасибо. Добавлено через 10 минут В предыдущем коде distinct не нужен.
0
|
|||||||
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
||||||
| 26.12.2019, 18:59 | ||||||
|
Возможно так будет проще и быстрее
1
|
||||||
|
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 25
|
|
| 26.12.2019, 19:46 [ТС] | |
|
invm, я проверил ваш последний код.
На вскидку был почти уверен, что он будет работать быстрее. Казалось бы - зачем нумеровать по трём порциям, когда можно свалить всё в кучу и одним махом пометить последние даты и их же потом отобрать. Но! Вы будете смеяться... Без update, только селект в последнем коде даёт 2 сек (SQL показывает), предыдущий код - 1 сек. Может быть и полторы или 1,7 - вы же понимаете, но 2 сек. не показывает. Я даже кэш чистил - DBCC FREEPROCCACHE для чистоты эксперимента. В чём причина? В голову приходит только одна мысль: серверу быстрее записать (куда? - в ОП или во временную БД?) три небольших массива данных, чем один большой...
0
|
|
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
|
| 26.12.2019, 20:31 | |
|
AleksFromBK, все что угодно может быть.
Если выложите актуальный план выполнения, можно будет найти причину.
0
|
|
| 26.12.2019, 20:31 | |
|
Помогаю со студенческими работами здесь
14
Отбор в древе значений Отбор и сортировка значений на листе Отбор/Фильтр в дереве значений ListView. Отбор уникальных значений Отбор и выделения значений из строк Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи
и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|