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.

rp.
źródło

Odpowiedzi:

180

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

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 
EggyBach
źródło
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
22
select whatever,columns,you,want from mytable
 where mykey=(select max(mykey) from mytable);
Adam Pierce
źródło
co to jest mykey? w moim przypadku?
Mowgli,
@Mowgli mykeyto indeks twojego stołu
Cliff Burton
2
Jeśli mykeyjest to unikalny identyfikator, to podejście nie pomogłoby
Iman Mahmoudinasab
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.

willurd
źródło
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)

Lionel Messi
źródło
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ś ... :)

Uważaj to za zrobione
źródło
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)
Neha Verma
źródło
2

Spróbuj tego

SELECT id from comission_fees ORDER BY id DESC LIMIT 1
Ashish Pathak
źródło
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; 
Neolisk
źródło
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
Jignesh Bhayani
źródło
0
SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)
manas
źródło
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 )

Muhammad Sajid
źródło
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
Sylvain Rodrigue
źródło
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')
user3096335
źródło
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

Walter Vehoeven
źródło
-1
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
Hamza Abuzahra
źródło
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
maniakk
źródło
7
Last () nie jest funkcją sql-server
Taryn