Sql oracle как выбрать последнюю запись
В подзапросе для каждой компании данные сортируются случайным образом при использовании функции newid(), после чего выбирается одна (первая строка) этого отсортированного набора:
Разумеется, вы скорее всего получите другой результат, но, поскольку данных в таблице немного, рано или поздно вы сможете получить и такой. :-)
Использование функции FIRST_VALUE
Эта оконная функция возвращает первое из упорядоченного набора значений. Теперь мы можем сделать все без подзапросов, выделив в окне набор рейсов для компании из текущей строки запроса с помощью предложения PARTITION BY и упорядочив его, как и в предыдущем примере, случайным образом в предложении ORDER BY:
Ключевое слово DISTINCT нужно здесь для того, чтобы не повторять одну и ту же компанию для каждого выполняемого ею рейса.
Засада с LAST_VALUE
Казалось бы, какая разница брать первое или последнее значение из случайным образом упорядоченного набора? Но давайте посмотрим, что мы получим, если в предыдущем запросе заменить FIRST_VALUE на LAST_VALUE:
Я приведу результаты только для id_comp = 1. Вы можете сами выполнить запрос, чтобы убедиться, что будут выводиться абсолютно все рейсы из таблицы Trip.
Что мы делаем в подобных случаях? Конечно, обращаемся к документации, а там мы читаем. Нет, постойте, сначала полный синтаксис:
Здесь
IGNORE NULLS или RESPECT NULLS определяют, будут ли учитываться NULL-значения;
предложение_rows_range задает параметры окна.
А теперь читаем:
Диапазоном по умолчанию является RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
Т.е. окном является диапазон от текущей строки и неограниченно выше. Поскольку мы выбираем последнюю строку диапазона, то всегда будет выводиться текущая строка, как бы не сортировались строки. Т.е. сколько бы строк выше не оказалось при случайной сортировке.
Потому и DISTINCT не помогает, т.к. все выводимые строки оказываются уникальными.
Значит нам просто нужно явно (и правильно!) задать параметры окна, а именно, от текущей строки и неограниченно ниже, поскольку мы выбираем последнее значение:
В общем дело такое искал я искал в инете везде где только можно эту задачку и решил что просто оставлю это здесь.
"Выбрать последнюю запись" можно таким запросом вопреки тому что все просят это сделать почему-то без подзапроса, просто, я тоже не знаю как это реализовать без подзапроса.
Этот вариант "переменная" какое число зададите такую строку из выборки он вам и даст.
Добавлено через 15 минут
Вот ещё вариант он более приятный на вид, но всёравно подзапрос.
Ставим в значение inner.r начальную строку и конечную соответсвенно и будет вам счастье. =)
Помощь в написании контрольных, курсовых и дипломных работ здесь
Как выбрать последнюю запись?
есть таблица TABLE1 ID счеть сума дата статус.
Вывести последнюю и k-ю запись
Написал запрос который выводит первую запись. Необходимо вывести последнюю и k-ю запись. .
Найти последнюю имеющуюся запись
Всем привет. Можете помочь написать запрос выводящий дату платежа, сумму затраченных средств в.
Как выбрать последнюю запись?
Есть таблица. В ней 4 столбца, во всех ячейках содержатся даты. В первую строку даты я вношу.
если нужно последнюю запись какого либо поля
П.С. правда не знаю, насколько второй запрос корректный, но работает)Некорректный.
ROWNUM определяется до ORDER BY, поэтому результат в общем случае будет неправильный.
У меня есть таблица, которая представляет собой элементы коллекции, чтобы, когда пользователь вошел в систему.
Как создать запрос, который дал бы мне последнюю дату для каждого пользователя?
обновление: Я забыл, что мне нужно, чтобы иметь значение, которое идет вместе с последней датой.
использование оконных функций (работает в Oracle, Postgres 8.4, SQL Server 2005, DB2, Sybase, Firebird 3.0, MariaDB 10.3)
Я вижу, что большинство разработчиков используют встроенный запрос, не учитывая его влияние на огромные данные.
просто, вы можете добиться этого:
чтобы получить всю строку, содержащую максимальный срок для пользователя:
Это должно дать вам правильный результат для вашего отредактированы вопрос.
подзапрос обязательно найдет только строки последней даты, а внешний GROUP BY позаботится о связях. Когда есть две записи для одной и той же даты для одного и того же пользователя, он вернет один с самым высоким value .
для Oracle сортирует результирующий набор в порядке убывания и берет первую запись, поэтому вы получите последнюю запись:
решить проблему. Это может не работать так хорошо на больших таблицах, даже с хорошей индексацией.
Select * from table1 where lastest_date=(select Max(latest_date) from table1 where user=yourUserName)
внутренний запрос вернет последнюю дату для текущего пользователя, внешний запрос вытащит все данные в соответствии с результатом внутреннего запроса.
я использовал этот способ, чтобы взять последнюю запись для каждого пользователя, который у меня есть на моем столе. Это был запрос, чтобы получить последнее местоположение для продавца в соответствии с недавним временем, обнаруженным на устройствах PDA.
мой небольшой сборник
- self join лучше, чем вложенные select
- но group by не дает primary key что предпочтительнее для join
- этот ключ может быть дано partition by в сочетании с first_value (docs)
Итак, вот запрос:
- фильтровать данные с помощью where оператор с использованием любого столбца
- select любой столбцы из отфильтрованных строк
Я сделал несколько для моего приложения, как это:
Ниже приведен запрос:
по моему опыту, самый быстрый способ-взять каждую строку, для которой в таблице нет новой строки. Вот небольшой тест с некоторыми данными, которые у меня есть под рукой.
другое преимущество заключается в том, что используемый синтаксис очень прост и что значение запроса довольно легко понять (возьмите все строки, чтобы не было новой строки для рассматриваемого имени пользователя).
НЕ СУЩЕСТВУЕТ
объясните общую стоимость : 2.38136
функции row_number
общая стоимость : 61.5823
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
объяснить общую стоимость: 67.5439
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
объяснить общую стоимость: 62.964
планы explain поступают из базы данных с примерно 10k строками, хранящимися в формате XML. Используемые запросы также содержат предикат "group_id = '1'".
вы также можете использовать аналитическую ранговую функцию
вы бы использовали агрегатную функцию MAX и GROUP BY
Это также должно работать, чтобы получить все последние записи для пользователей.
Таблица имеет суррогатный первичный ключ, сгенерированный из последовательности. К сожалению, эта последовательность используется для генерации ключей для некоторых других таблиц (я ее не проектировал и не могу ее изменить).
Каков самый быстрый способ выбрать последние n вставленные записи в Oracle, упорядоченные по идентификатору в порядке убывания (последняя вставленная вверху)?
n - относительно небольшое число - количество записей для отображения на странице - вероятно, не больше 50.
В таблице теперь 30 000 000 записей, ежедневно добавляется 10-15 тысяч новых записей.
База данных - Oracle 10g.
Изменить:
В ответ на один комментарий: Этот вопрос был мотивирован планом выполнения запроса:
План исполнения был:
Я был удивлен, что Oracle хочет выполнить полное сканирование и сортировку таблицы, когда у него есть индекс в поле сортировки.
Запрос из принятого ответа использует индекс и избегает сортировки.
Изменить 2:
Re. Комментарий APC: Сортировка меня удивила. Я ожидал, что Oracle будет использовать индекс для извлечения строк в ожидаемом порядке. План выполнения запроса:
Использует индекс вместо полного доступа к таблице и сортировки (обратите внимание на условие rownum < 50.000.000 - это намного больше, чем количество записей в таблице, и Oracle знает, что он должен получить все записи из таблицы). Этот запрос возвращает все строки как первый запрос, но со следующим планом выполнения:
Для меня было необычным, что Oracle создает разные планы выполнения для этих двух запросов, которые по существу возвращают один и тот же набор результатов.
Изменить 3: Комментарий Re Amoq:
Oracle не знает, что 50M больше, чем количество строк. Конечно, у него есть статистика, но она может быть старой и неправильной - и Oracle никогда не позволит себе выдать неверный результат только потому, что статистика неверна.
Ты уверен? В версиях Oracle до 9 рекомендуется время от времени обновлять статистику вручную. Начиная с версии 10 Oracle автоматически обновляет статистику. Какая польза от статистических данных, если Oracle не использует их для оптимизации запросов?
Читайте также: