Як прочитати останній рядок за допомогою SQL Server


88

Який найефективніший спосіб читати останній рядок за допомогою SQL Server?

Таблиця індексується за унікальним ключем - значення ключа "внизу" представляють останній рядок.

Відповіді:


180

Якщо ви використовуєте MS SQL, ви можете спробувати:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

17
Що робити, якщо у вас є 5 мільйонів записів у БД! : - \
deepdive

4
Якщо таблиця індексується у стовпці сортування, тоді SQL просто прочитає останній рядок таблиці. Не потрібно дорогого сортування та сканування повної таблиці.
Співоніус

Якщо мені потрібно отримати останні 1000 записів, як я можу це зробити, скажімо
Шрі

1
@Sri Ви б виконали SELECT TOP 1000 * FROM table_name ORDER BY column_name DESCі повинні вивести останні 1000 записів.
Род Аргумедо,


18

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

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

Тест ORDER BY columnповідомляє йому, щоб переставити результати відповідно до даних цього стовпця, а DESCтест - змінити результати (таким чином ставлячи останній на перше місце). Після цього, він LIMIT 1повідомляє йому, щоб повернути назад лише один рядок.


6
MSSQL не використовує LIMIT
Вінко Врсалович,

4
Нічого собі, жорстке, в оригінальному запитанні навіть не було сказано конкретно про SQL Server. Вищевказане рішення є цілком законним, хоча SQL Server використовує різні слова для опису одного і того ж поняття. +1
Грег Хьюгілл

11

Якщо деякі ваші ідентифікатори в порядку, я припускаю, що у вашому базі даних буде певний порядок

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


4

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

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

Сподіваюся, ви це зрозуміли ... :)


Це найкраще рішення, коли ви не можете сортувати DESC, а вам просто потрібен останній рядок, коли він повертається.
jjthebig1

3

Я спробував використати останній запит у 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)

3

Ви можете використовувати last_value: SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...

Я тестую його в одній зі своїх баз даних, і він працював, як очікувалося.

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


2

Спробуйте це

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

1
Як коментар вище від @Vinko Vrsalovic говорить, що MSSQL не використовує LIMIT. Це повертаєтьсяIncorrect syntax near LIMIT
frmbelz

1

Для того, щоб отримати останній рядок таблиці для бази даних 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; 

2
select top 1без замовлення не є надійним способом отримати перший запис. Якщо ви не впорядкуєте до, ви даєте дозвіл на SQL надавати вам будь-який бажаний запис.
Чарівник коду

1

OFFSET і FETCH NEXT є особливістю SQL Server 2012 для досягнення підкачки під час відображення результатів.

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

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

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

1
Найкраща відповідь аналогічно, ми можемо отримати перший рядок SELECT * від працівників, де [Ідентифікатор працівника] = ВСЕ (ВИБЕРІТЬ МІН ([Ідентифікатор працівника]) від працівників)
manas,

0

Ось як ви отримуєте останній запис і оновлюєте поле в Access DB.

ОНОВЛЕННЯ compalints SET tkt = addzone &'-'& customer_code &'-'& sn where sn in (select max(sn) from compalints )


0

Якщо у вас немає впорядкованого стовпця, ви можете використовувати фізичний ідентифікатор кожного рядка:

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

0

Якщо у вас є реплікаційна таблиця, ви можете мати Identity = 1000 у localDatabase та Identity = 2000 у clientDatabase, тому, якщо ви вловите останній ідентифікатор, ви завжди зможете знайти останній із клієнта, а не останній із поточної підключеної бази даних. Отже, найкращим методом, який повертає останню підключену базу даних, є:

SELECT IDENT_CURRENT('tablename')

0

Ну, я не отримую "останнє значення" в таблиці, я отримую останнє значення за фінансовим інструментом. Це не те саме, але, мабуть, це актуально для деяких, хто хоче подивитися на те, "як це робиться зараз". Я також використовував RowNumber () і CTE, а перед цим просто взяв 1 і впорядкував за [стовпець] desc. однак нам більше не потрібно ...

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

У цій таблиці ми маємо 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 імпорту обміну перекачує дані в таблицю, буде якесь блокування, що сповільнює мене ... саме так працюють живі системи. план виконання проти 85 697 659 рядків


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

Ласкаво просимо на сайт. Це може бути коментар (якби у вас був представник), чи не могли б ви його розширити, додавши текст, щоб пояснити, як він вирішує проблему, та відрізнити його від 10 попередніх відповідей?
gung - Відновити Моніку

-5

Я майже впевнений, що це:

SELECT last(column_name) FROM table

Оскільки я використовую щось подібне:

SELECT last(id) FROM Status

7
Last () не є функцією sql-сервера
Тарин
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.