SIR

Получить для каждого элемента максимальную дату и цену, соответствующую этой дате

22.08.2007, 19:35. Показов 2403. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужен такой хитрейший запрос:
Вот есть скажем таблица:
Element DDoc Price
1 01.01.01 200
1 02.01.01 150
2 03.01.01 150
2 02.02.01 120
2 01.02.01 300
...
Вот нужно получить в результате для каждого элемента максимальную дату и цену, соответствующую этой дате!
Т.е.
1 02.01.01 150
2 03.01.01 150
Ну не знаю как это сделать!!! Получается только через курсор.
Спасибо.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.08.2007, 19:35
Ответы с готовыми решениями:

Файл содержит записи о дате. Указать максимальную дату для второй половины года
Помогите с решением Создать файл, содержащий записи о дате: день (1..31), месяц (1..12), год (00..99). Обработать этот файл и указать...

Как получить запросом максимальную цену
Как запросом при получить максимальную цену закупки материала и месяц в каком покупался материал?

Ввести дату, напечатать номер дня года, соответствующий этой дате
Ввести дату в формате дд.мм.гггг, напечатать номер дня года, соответствующий этой дате(1 января -- 1-й день и т.д.)

11
0 / 0 / 1
Регистрация: 22.07.2007
Сообщений: 260
22.08.2007, 20:06
SQL
1
2
3
4
5
6
7
SELECT t.Element, m.mDDoc, MAX(t.Price) 
FROM 
Table1 t, 
(SELECT Element, MAX(DDoc) AS mDDoc FROM Table1 GROUP BY Element) m WHERE
t.Element = m.Element AND
t.DDoc = m.mDDoc
GROUP BY t.Element, m.mDDoc
0
AiK
22.08.2007, 20:26
Элементарно, Ватсон!

SQL
1
2
3
4
SELECT * FROM 
ttt t1
WHERE
t1.date = (SELECT MAX(DATE) FROM ttt t2 WHERE t2.id  = t1.id)
NB: надеюсь колонки заменишь на нужные

To Admin: положи этот пример в самплесы - это довольно распространённый вопрос у начинающих,
я на него уже раз в пятый на разных форумах отвечаю
0 / 0 / 2
Регистрация: 17.08.2007
Сообщений: 222
23.08.2007, 10:59
Можешь поупражняться с иннер-джойном:
SQL
1
2
3
4
5
SELECT t.element, t.price, t.Ddate 
FROM table1 t INNER JOIN
(SELECT MAX(Ddate) AS dat, element FROM table1
 GROUP BY element) tm
ON (t.element=tm.element) AND (t.Ddate=tm.dat)
0
0 / 0 / 1
Регистрация: 22.07.2007
Сообщений: 260
23.08.2007, 11:03
Вопрос был не совсем элементарный, дело в том что первый вариант для каждого документа возвращает только одну строку с максимальной датой и максимальной ценой для этой даты, а второй вернет все варианты цены на максимальную дату для каждого документа. Конечно, все зависит от сути задачи.
0
AiK
23.08.2007, 11:47
to AndreP:

Согласен, не подумал о возможности наличия у одного элемента двух дат. Только мне кажется что такой вариант:

SQL
1
2
3
4
5
SELECT t1.id, t2.date, MAX(price) FROM 
ttt t1
WHERE
t1.date = (SELECT MAX(DATE) FROM ttt t2 WHERE t2.id = t1.id)
GROUP BY t1.id, t2.date
будет работать быстрее, чем твой, хотя бы потому, что на один group by меньше.

И ещё вопросик:
я никогда не работал с подселектами, к которым потом обращаются как к таблице.
IMHO, это творчество мелкомягких.
Итак вопрос: насколько эта конструкция пробивается оптимизатором? Есть подозрения большие, что m - неявная временная (рабочая)таблица, которая не содержит индексов, соответственно на больших таблицах это чревато...
SIR
23.08.2007, 11:55
Согласитесь,что задача элементарная. Вот я и думаю, господа, когда присылаете ответы и называете 'начинающим' сами посмотрите результаты своих решений.
А на счет сути задачи, то я свел довольно сложную задачу и очень специфическую задачу (складской учет) к такой 'простенькой' задачке.
На счет варианта решения я делаю так.
Беру и делаю курсор, где сортирую по дате, а потом прото выбираю первую строку, удовлетворяющую моей задаче.
0 / 0 / 1
Регистрация: 22.07.2007
Сообщений: 260
23.08.2007, 12:18
to Aik:
Подзапрос стандартное решение для Oracle и MS SQL, хотя мне больше нравиться использование View. По оптимизации и быстродействию эти варианты должны быть одинаковы, в обоих случаях создается виртуальная таблица.

to SIR:
Я проверял свой вариант, да и второй будет работать. А вариант с курсором, несомненно, будет работать в несколько раз медленнее, если только в таблице достаточно много записей и это можно заметить :-)
0
AiK
23.08.2007, 14:41
To AndreP:
довольно любопытно: твой вариант на таблице без индексов работает раза в полтора быстрее, с индексом оба варианта работают одинаково.
0 / 0 / 1
Регистрация: 22.07.2007
Сообщений: 260
23.08.2007, 17:22
Уточнение to AiK:
Когда я сравнивал быстродействие, то имел в виду вариант с подзапросом и с View, оно приблизительно одинаково.
Что касается разницы в быстродействии вариантов с подзапросом в условии From и в условии Where, то, по видимому, в первом случае подзапрос выполняется сразу по всем документам, а во втором отдельно по каждому. Поэтому без индекса первый вариант выполняется существенно быстрее, а с индексом разница мала.
0
SIR
26.08.2007, 11:19
Спасибо, все работает !!!
SIR
26.08.2007, 14:08
Кстати, я подумал, а что если есть скажем еще одна дата документа, назовем ее DDoc2, и нужно сделать выборку, где DDoc - максимальна, а DDoc2 - минимальна.
Я пока решения не нашел.
P.S. Это просто задачка для тренировки.
Спасибо всем!!!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.08.2007, 14:08
Помогаю со студенческими работами здесь

Получить цену номенклатуры в определенную дату
привет всем! учусь программированию 1С, поставили такую задачу: - выбрать номенклатуру(в поле ввода) и через кнопки получить цену...

При наличии номера недели получить дату начала и дату окончания этой недели
Подскажите как можно решить следующую задачу. У меня есть номер недели например :не деля 38. Мне нужно получить дату начала и...

Даны два целых числа: D (день) и M (месяц), определяющие правильную дату. Вывести знак Зодиака, соответствующий этой дате
Даны два целых числа: D (день) и M (месяц), определяющие правильную дату. Вывести знак Зодиака, соответствующий этой дате: «Водолей»...

Найти максимальную длину провода M, при которой можно получить по меньшей мере K кусочков этой длины
Ограничение по времени: 2 секунды Ограничение по памяти: 64 мегабайта На складе есть провода различной целочисленной длины. Их можно...

Получить новый массив, вычислив для каждого элемента сумму цифр в записи числа
дан двумерный вещественный массив, состоящий из N строк и M столбцов. получить новый массив, вычислив для каждого элемента сумму цифр в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru