Как прочитать последнюю строку с SQL Server - PullRequest
80 голосов
/ 07 октября 2008

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

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

Ответы [ 16 ]

162 голосов
/ 07 октября 2008

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

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 
21 голосов
/ 07 октября 2008
select whatever,columns,you,want from mytable
 where mykey=(select max(mykey) from mytable);
17 голосов
/ 07 октября 2008

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

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

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

10 голосов
/ 22 декабря 2012

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

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

3 голосов
/ 10 февраля 2015

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

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

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

3 голосов
/ 12 сентября 2014

Я попытался использовать последний запрос SQL в SQl Server 2008, но это дает ошибку "last" не является распознанным именем встроенной функции. "

Итак, я использовал:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

, чтобы получить Id последнего ряда. Можно также использовать

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)
2 голосов
/ 29 апреля 2015

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

Я тестирую его на одной из моих баз данных, и он работает как положено.

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

2 голосов
/ 31 марта 2015

Попробуйте это

SELECT id from comission_fees ORDER BY id DESC LIMIT 1
1 голос
/ 27 февраля 2009

Чтобы получить последнюю строку таблицы для базы данных 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; 
0 голосов
/ 03 августа 2018

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

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

У нас есть 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...