Как читать последнюю строку с помощью SQL Server

Каков наиболее эффективный способ чтения последней строки с помощью SQL Server?

Таблица индексируется по уникальному ключу - «нижние» значения ключа представляют последнюю строку.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
90
0
367 825
17
Перейти к ответу Данный вопрос помечен как решенный

Ответы 17

Вам понадобится какой-то столбец с уникальной идентификацией в вашей таблице, например, первичный ключ с автозаполнением или столбец datetime (желательно первичный ключ). Тогда вы можете сделать это:

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

ORDER BY column говорит ему переупорядочить результаты в соответствии с данными этого столбца, а DESC говорит ему отменить результаты (таким образом, ставя последний первым). После этого LIMIT 1 сообщает ему, что нужно пройти назад только на одну строку.

Вау, сурово, в исходном вопросе даже не говорилось конкретно о SQL Server. Вышеупомянутое решение совершенно законно, хотя SQL Server использует разные слова для описания одной и той же концепции. +1

Greg Hewgill 07.10.2008 10:08

@VinkoVrsalovic, это не значит, что ответ бесполезен, наоборот, даже через десять лет. Вы согласны со мной, сэр?

snr 07.12.2020 17:52

Это проблема письменного общения - его легко читать гораздо резче, чем предполагалось, особенно когда оно краткое! Теперь я знаю это и понимаю, что ответственность лежит на писателе. Итак, если бы я написал это сегодня, я бы сказал: «Это идея, хотя вам нужно будет использовать TOP вместо LIMIT для SQL Server, поскольку это механизм DMBS, отмеченный в вопросе. См. docs.microsoft.com/en-us/sql/t-sql/queries/…" @snr

Vinko Vrsalovic 07.12.2020 18:14

select whatever,columns,you,want from mytable
 where mykey=(select max(mykey) from mytable);

что такое mykey? в моем случае?

Mowgli 21.08.2013 22:05

@Mowgli mykey - это индекс вашей таблицы

Cliff Burton 17.04.2015 21:00

Если mykey - уникальный идентификатор, этот подход не поможет

Iman Mahmoudinasab 08.05.2018 12:35
Ответ принят как подходящий

Если вы используете MS SQL, вы можете попробовать:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

Что делать, если у вас в БД 5 миллионов записей! : - \

deepdive 08.07.2015 07:06

Если таблица проиндексирована по столбцу сортировки, SQL просто прочитает последнюю строку таблицы. Не требуется дорогостоящая сортировка или полное сканирование таблицы.

Spivonious 23.07.2018 19:43

Если мне нужно получить последние 1000 записей, как я могу получить, можете ли вы сказать

Sri 26.12.2018 09:11

@Sri Вы должны выполнить SELECT TOP 1000 * FROM table_name ORDER BY column_name DESC и вывести последние 1000 записей.

Rod Argumedo 03.06.2019 18:35

Чтобы получить последнюю строку таблицы для базы данных MS SQL 2005, вы можете использовать следующий запрос:

select top 1 column_name from table_name order by column_name desc; 

Примечание: Чтобы получить первую строку таблицы для базы данных MS SQL 2005, Вы можете использовать следующий запрос:

select top 1 column_name from table_name; 

select top 1 без заказа - ненадежный способ получить первую запись. Если вы не разместите заказ до, вы даете разрешение SQL предоставить вам любую запись, которую он пожелает.

Code Magician 09.02.2012 21:35

Я почти уверен, что это так:

SELECT last(column_name) FROM table

Потому что я использую нечто подобное:

SELECT last(id) FROM Status

Last () не является функцией sql-сервера

Taryn 17.02.2012 01:30

SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)

Точно так же лучший ответ мы можем получить первую строку SELECT * от сотрудников, где [Employee ID] = ALL (SELECT MIN ([Employee ID]) от сотрудников)

manas 01.07.2011 22:22

Таким образом вы получаете последнюю запись и обновляете поле в Access DB.

ОБНОВИТЬcompalintsSET tkt = addzone &'-'& customer_code &'-'& sn where sn in (select max(sn) from compalints )

Если некоторые из ваших идентификаторов в порядке, я предполагаю, что в вашей базе данных будет какой-то порядок

SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)

Если у вас есть реплицированная таблица, у вас может быть Identity = 1000 в localDatabase и Identity = 2000 в clientDatabase, поэтому, если вы поймаете последний идентификатор, вы всегда сможете найти последний идентификатор из клиента, а не последний из текущей подключенной базы данных. Итак, лучший метод, который возвращает последнюю подключенную базу данных:

SELECT IDENT_CURRENT('tablename')

SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)

Добро пожаловать на сайт. Это может быть комментарий (если бы у вас был представитель), не могли бы вы расширить его, добавив текст, чтобы объяснить, как он решает проблему, и чтобы отличить его от 10 предыдущих ответов?

gung - Reinstate Monica 19.07.2014 18:36

Я попытался использовать последний запрос в sql на сервере SQl 2008, но он дает эту ошибку: «'last' не является распознанным именем встроенной функции».

В итоге я использовал:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

чтобы получить идентификатор последней строки. Можно также использовать

Declare @i int
set @i=1
select WorkflowStateStatusId from Workflow.WorkflowStateStatus
 where WorkflowStateStatusId not in (select top (
   (select count(*) from Workflow.WorkflowStateStatus) - @i ) WorkflowStateStatusId from .WorkflowStateStatus)

Если у вас нет упорядоченного столбца, вы можете использовать физический идентификатор каждой строки:

SELECT top 1 sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot], 
              T.*
FROM MyTable As T
order by sys.fn_PhysLocFormatter(%%physloc%%) DESC

это действительно хороший ответ для абстракций, когда ключевое поле может быть неизвестно или даже не существовать. Однако %% Physloc %% возрастает, и сортировка по форматированному полю вызывает ошибки, например. (1: 2: 30) отображается меньше, чем (1: 2: 4). Предложите изменить запрос, чтобы удалить средство форматирования и вместо этого напрямую использовать %% Physloc %%, например ---- упорядочить по %% Physloc %% desc ----

MoustacheDangerous 12.01.2021 15:24

Я думаю, что нижеприведенный запрос будет работать для SQL Server с максимальной производительностью без какого-либо сортируемого столбца.

SELECT * FROM table 
WHERE ID not in (SELECT TOP (SELECT COUNT(1)-1 
                             FROM table) 
                        ID 
                 FROM table)

Надеюсь, вы это поняли ... :)

Это лучшее решение, когда вы не можете отсортировать DESC и вам нужна только последняя строка, поскольку она возвращается.

jjthebig1 21.08.2019 02:26

Попробуй это

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

Как указано выше в комментарии @Vinko Vrsalovic, MSSQL не использует LIMIT. Это возвращает Incorrect syntax near LIMIT

frmbelz 03.12.2019 23:28

Вы можете использовать last_value: SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...

Я тестировал его в одной из своих баз данных, и он работал, как ожидалось.

Вы также можете проверить документацию здесь: https://msdn.microsoft.com/en-us/library/hh231517.aspx

Ну, я получаю не «последнее значение» в таблице, я получаю последнее значение по финансовому инструменту. Это не то же самое, но я думаю, это актуально для тех, кто хочет узнать, «как это делается сейчас». Я также использовал RowNumber () и CTE, а до этого просто взял 1 и упорядочил по [столбцу] по убыванию. однако нам больше не нужно ...

Я использую SQL Server 2017, мы записываем все тики на всех биржах по всему миру, у нас есть ~ 12 миллиардов тиков в день, мы храним каждую цену Bid, Ask и сделку, включая объемы и атрибуты тика (bid, ask, trade ) любой из указанных бирж.

У нас есть 253 типа данных тиков для любого конкретного контракта (в основном статистика) в этой таблице, последняя торгуемая цена - это тип тика = 4, поэтому, когда нам нужно получить "последнюю" цену, мы используем:

select distinct T.contractId,
LAST_VALUE(t.Price)over(partition by t.ContractId order by created ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
from [dbo].[Tick] as T
where T.TickType=4

Вы можете увидеть план выполнения в моей системе разработки, он выполняется довольно эффективно, выполняется за 4 секунды, в то время как ETL импорта обмена закачивает данные в таблицу, будет некоторая блокировка, замедляющая меня ... именно так работают живые системы. execution plan against 85,697,659 rows

OFFSET и FETCH NEXT - это функция SQL Server 2012 для выполнения подкачки SQL при отображении результатов.

Аргумент OFFSET используется для определения начальной строки для возврата строк из результата, а аргумент FETCH используется для возврата набора из числа строк.

SELECT *
FROM table_name
ORDER BY unique_column desc
OFFSET 0 Row
FETCH NEXT 1 ROW ONLY

Другие вопросы по теме