Sql oracle как выбрать последнюю запись

Обновлено: 05.07.2024

В подзапросе для каждой компании данные сортируются случайным образом при использовании функции 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 не помогает, т.к. все выводимые строки оказываются уникальными.

Значит нам просто нужно явно (и правильно!) задать параметры окна, а именно, от текущей строки и неограниченно ниже, поскольку мы выбираем последнее значение:

В общем дело такое искал я искал в инете везде где только можно эту задачку и решил что просто оставлю это здесь.
"Выбрать последнюю запись" можно таким запросом вопреки тому что все просят это сделать почему-то без подзапроса, просто, я тоже не знаю как это реализовать без подзапроса.

Этот вариант "переменная" какое число зададите такую строку из выборки он вам и даст.

Этот вариант просто выводит только последнюю строку соответсвтенно если было что-то заинсёрчено то оно будет последним в таблице с наибольшим rownum конечно же если вид таблицы небыл зарание от order by'ин

Добавлено через 15 минут
Вот ещё вариант он более приятный на вид, но всёравно подзапрос.
Ставим в значение inner.r начальную строку и конечную соответсвенно и будет вам счастье. =)

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Как выбрать последнюю запись?
есть таблица TABLE1 ID счеть сума дата статус.


Вывести последнюю и k-ю запись
Написал запрос который выводит первую запись. Необходимо вывести последнюю и k-ю запись. .

Найти последнюю имеющуюся запись
Всем привет. Можете помочь написать запрос выводящий дату платежа, сумму затраченных средств в.


Как выбрать последнюю запись?
Есть таблица. В ней 4 столбца, во всех ячейках содержатся даты. В первую строку даты я вношу.

Слово "последний" в реляционной алгебре не имеет особого смылса без явно заданной операции упорядочения элементов. Во всех ваших запросах увидел ORDER BY только применительно к rownum. С чего вдруг rownum должен сохранться при выборке из произвольной таблицы. Мне кажется сначала нужно определить критерий "последнего", а потом уже его выбрать.

если нужно последнюю запись какого либо поля

П.С. правда не знаю, насколько второй запрос корректный, но работает)

Некорректный.
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 не использует их для оптимизации запросов?

Читайте также: