Как прочитать последнюю строку с SQL Server
каков наиболее эффективный способ чтения последней строки с SQL Server?
таблица индексируется по уникальному ключу -- значения" Нижнего " ключа представляют последнюю строку.
16 ответов:
Если вы используете MS SQL, вы можете попробовать:
SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC
вам понадобится какой-то уникально идентифицирующий столбец в вашей таблице, например, первичный ключ с автоматическим заполнением или столбец datetime (предпочтительно первичный ключ). Тогда вы можете сделать это:
SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1
The
ORDER BY column
говорит ему повторно изменить результаты в соответствии с данными этого столбца, иDESC
говорит ему, чтобы отменить результаты (таким образом, поставив последний первым). После этогоLIMIT 1
говорит, что он передает только одну строку назад.
Если некоторые из ваших идентификаторов в порядке, я предполагаю, что в вашей БД будет какой-то порядок
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
Я пробовал использовать last в sql query в SQl server 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)
Я думаю, что ниже запрос будет работать для SQL Server с максимальной производительностью без каких-либо сортируемых столбцов
SELECT * FROM table WHERE ID not in (SELECT TOP (SELECT COUNT(1)-1 FROM table) ID FROM table)
надеюсь, вы поняли это... :)
вы можете использовать last_value:
SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...
Я проверить его в одной из моих баз данных, и он работал, как ожидалось.
вы также можете проверить документацию de здесь:https://msdn.microsoft.com/en-us/library/hh231517.aspx
чтобы получить последнюю строку таблицы для базы данных 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;
Так вы получаете последнюю запись и обновляете поле в Access DB.
обновление
compalints
SET tkt = addzone &'-'& customer_code &'-'& sn where sn in (select max(sn) from compalints )
Если у вас нет упорядоченного столбца, вы можете использовать физический идентификатор каждой строки:
SELECT top 1 sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot], T.* FROM MyTable As T order by sys.fn_PhysLocFormatter(%%physloc%%) DESC
Если у вас есть реплицированная таблица, Вы можете иметь Identity=1000 в localDatabase и Identity=2000 в clientDatabase, поэтому, если вы поймаете последний идентификатор, вы всегда можете найти последний из клиента, а не последний из текущей подключенной базы данных. Таким образом, лучший метод, который возвращает последнюю подключенную базу данных:
SELECT IDENT_CURRENT('tablename')
Ну я не получаю "последнее значение" в таблице, я получаю последнее значение на финансовый инструмент. Это не то же самое, но я думаю, это актуально для некоторых, которые хотят посмотреть на "как это делается сейчас". Я также использовал RowNumber () и CTE, а до этого просто взял 1 и упорядочил по [столбцу] desc. однако нам это больше не нужно...
Я использую 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
вы можете увидеть план выполнения в моей системе dev, который он выполняет довольно эффективно, выполняется за 4 секунды, пока exchange import ETL перекачивает данные в стол, там будет какая-то блокировка, замедляющая меня... именно так работают живые системы.