Каков наиболее эффективный способ чтения последней строки с помощью SQL Server?
Таблица индексируется по уникальному ключу - «нижние» значения ключа представляют последнюю строку.
Ответы:
Если вы используете MS SQL, вы можете попробовать:
SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC
SELECT TOP 1000 * FROM table_name ORDER BY column_name DESC
и вывести последние 1000 записей.
select whatever,columns,you,want from mytable
where mykey=(select max(mykey) from mytable);
mykey
- это индекс вашей таблицы
mykey
это уникальный идентификатор, этот подход не помог бы
Вам понадобится какой-то столбец с уникальной идентификацией в вашей таблице, например, первичный ключ с автозаполнением или столбец datetime (предпочтительно первичный ключ). Тогда вы можете сделать это:
SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1
ORDER BY column
Говорит его rearange результатов в соответствии с данными этого столбца, и DESC
сообщает ему , чтобы полностью изменить результаты (положив тем самым последнюю первым). После этого LIMIT 1
он сообщает ему, что нужно передать только одну строку.
Если некоторые из ваших идентификаторов в порядке, я предполагаю, что в вашей базе данных будет какой-то порядок
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
Я думаю, что ниже запрос будет работать для SQL Server с максимальной производительностью без какого-либо сортируемого столбца
SELECT * FROM table
WHERE ID not in (SELECT TOP (SELECT COUNT(1)-1
FROM table)
ID
FROM table)
Надеюсь, вы это поняли ... :)
Я пробовал использовать last в 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)
Вы можете использовать last_value: SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...
Я тестировал его в одной из своих баз данных, и он работал, как ожидалось.
Вы также можете проверить документацию здесь: https://msdn.microsoft.com/en-us/library/hh231517.aspx
Попробуй это
SELECT id from comission_fees ORDER BY id DESC LIMIT 1
LIMIT
. Это возвращаетсяIncorrect syntax near LIMIT
Чтобы получить последнюю строку таблицы для базы данных 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 выдать вам любую запись, которую он пожелает.
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
Таким образом вы получаете последнюю запись и обновляете поле в 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 и упорядочил по [столбцу] по убыванию. однако нам больше не нужно ...
Я использую 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 импорта обмена закачивает данные в таблицу, будет некоторая блокировка, замедляющая меня ... именно так работают живые системы.
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)