Jak czytać ostatni wiersz w SQL Server


88

Jaki jest najbardziej efektywny sposób odczytania ostatniego wiersza w SQL Server?

Tabela jest indeksowana według unikalnego klucza - „najniższe” wartości klucza reprezentują ostatni wiersz.

Odpowiedzi:


180

Jeśli używasz MS SQL, możesz spróbować:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

17
Co jeśli masz 5 milionów rekordów w DB! : - \
deepdive,

4
Jeśli tabela jest indeksowana w kolumnie sortowania, SQL odczyta tylko ostatni wiersz tabeli. Nie jest potrzebne drogie sortowanie ani pełne skanowanie tabeli.
Spivonious

Jeśli muszę zdobyć ostatnie 1000 rekordów, jak to zrobić, czy możesz powiedzieć
Sri

1
@Sri Wykonasz SELECT TOP 1000 * FROM table_name ORDER BY column_name DESCi powinieneś wypisać ostatnie 1000 rekordów.
Rod Argumedo


18

Będziesz potrzebował jakiejś unikalnie identyfikującej kolumny w swojej tabeli, takiej jak automatycznie uzupełniający się klucz podstawowy lub kolumna z datą i godziną (najlepiej klucz podstawowy). Następnie możesz to zrobić:

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

ORDER BY columnMówi do rearange wyniki zgodnie z danymi tej kolumny, a DESCmówi się na odwrotnej wyniki (czyli umieszczenie ostatni pierwsze). Następnie LIMIT 1każe mu przejść tylko jeden wiersz.


6
MSSQL nie używa LIMITU
Vinko Vrsalovic,

4
Wow, ostro, pierwotne pytanie nawet nie mówiło konkretnie o SQL Server. Powyższe rozwiązanie jest całkowicie uzasadnione, mimo że SQL Server używa innych słów do opisania tego samego pojęcia. +1
Greg Hewgill,

11

Jeśli niektóre z twoich identyfikatorów są w porządku, zakładam, że w twojej bazie danych będzie jakiś porządek

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


4

Myślę, że poniższe zapytanie będzie działać dla SQL Server z maksymalną wydajnością bez żadnej sortowalnej kolumny

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

Mam nadzieję, że to zrozumiałeś ... :)


To najlepsze rozwiązanie, gdy nie możesz posortować DESC i potrzebujesz tylko ostatniego wiersza, gdy jest zwracany.
jjthebig1

3

Próbowałem użyć last w kwerendzie sql na serwerze SQl 2008, ale daje to następujący błąd: „'last' nie jest rozpoznawalną nazwą funkcji wbudowanej”.

Więc ostatecznie użyłem:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

aby uzyskać identyfikator ostatniego rzędu. Przydałoby się też

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

Spróbuj tego

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

1
Jako komentarz powyżej @Vinko Vrsalovic mówi, że MSSQL nie używa LIMIT. To powracaIncorrect syntax near LIMIT
frmbelz

1

Aby pobrać ostatni wiersz tabeli dla bazy danych MS SQL 2005, możesz użyć następującego zapytania:

select top 1 column_name from table_name order by column_name desc; 

Uwaga: Aby uzyskać pierwszy wiersz tabeli dla bazy danych MS SQL 2005, możesz użyć następującego zapytania:

select top 1 column_name from table_name; 

2
select top 1bez zamówienia przez nie jest niezawodnym sposobem na zdobycie pierwszego rekordu. Jeśli nie złożysz zamówienia do dnia, zezwalasz SQL na przekazanie Ci dowolnego rekordu, który mu się podoba.
Code Magician

1

OFFSETi FETCH NEXTsą funkcją SQL Server 2012 umożliwiającą stronicowanie SQL podczas wyświetlania wyników.

OFFSETArgument ten jest wykorzystywany do określenia, wiersz wyjściowe do rzędów obie z wyników i FETCHargumentem służy do powrotu zestaw wielu rzędach.

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
Najlepszą odpowiedź podobnie możemy uzyskać w pierwszym wierszu SELECT * from Employees, gdzie [Employee ID] = ALL (SELECT MIN ([Employee ID]) from Employees)
manas

0

W ten sposób uzyskujesz ostatni rekord i aktualizujesz pole w bazie danych Access.

AKTUALIZACJA compalints SET tkt = addzone &'-'& customer_code &'-'& sn where sn in (select max(sn) from compalints )


0

Jeśli nie masz żadnej uporządkowanej kolumny, możesz użyć fizycznego identyfikatora każdego wiersza:

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

0

Jeśli masz zreplikowaną tabelę, możesz mieć Identity = 1000 w localDatabase i Identity = 2000 w clientDatabase, więc jeśli złapiesz ostatni identyfikator, zawsze możesz znaleźć ostatni z klienta, a nie ostatni z aktualnie podłączonej bazy danych. Dlatego najlepszą metodą zwracania ostatnio podłączonej bazy danych jest:

SELECT IDENT_CURRENT('tablename')

0

Cóż, nie otrzymuję „ostatniej wartości” w tabeli, otrzymuję ostatnią wartość na instrument finansowy. To nie to samo, ale wydaje mi się, że jest to istotne dla niektórych, którzy chcą sprawdzić, „jak to się teraz robi”. Użyłem również RowNumber () i CTE, a wcześniej po prostu wziąć 1 i uporządkować według [kolumna] desc. jednak nie musimy już ...

Używam SQL Server 2017, rejestrujemy wszystkie ticky na wszystkich giełdach na całym świecie, mamy ~ 12 miliardów ticków dziennie, przechowujemy każdą ofertę kupna, zapytaj i handel, w tym wolumeny i atrybuty ticka (kup, kup, handel ) dowolnej z podanych giełd.

Mamy 253 typy ticków dla dowolnego kontraktu (głównie statystyki) w tej tabeli, ostatnia notowana cena to typ tick = 4, więc kiedy musimy uzyskać "ostatnią" cenę używamy:

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

Możesz zobaczyć plan wykonania w moim systemie deweloperskim, który wykonuje dość wydajnie, wykonuje się w 4 sekundy, podczas gdy import ETL z wymiany pompuje dane do tabeli, będzie trochę blokad, które spowalniają mnie ... tak właśnie działają systemy na żywo. plan wykonania na 85.697.659 wierszy


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

Witamy na stronie. Może to być komentarz (jeśli miałbyś przedstawiciela), czy mógłbyś go rozszerzyć, dodając jakiś tekst wyjaśniający, jak rozwiązuje problem i odróżnić go od 10 poprzednich odpowiedzi?
gung - Przywróć Monikę

-5

Jestem prawie pewien, że tak:

SELECT last(column_name) FROM table

Ponieważ używam czegoś podobnego:

SELECT last(id) FROM Status

7
Last () nie jest funkcją sql-server
Taryn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.