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:
Jeśli używasz MS SQL, możesz spróbować:
SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC
SELECT TOP 1000 * FROM table_name ORDER BY column_name DESC
i powinieneś wypisać ostatnie 1000 rekordów.
select whatever,columns,you,want from mytable
where mykey=(select max(mykey) from mytable);
mykey
to indeks twojego stołu
mykey
jest to unikalny identyfikator, to podejście nie pomogłoby
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 column
Mówi do rearange wyniki zgodnie z danymi tej kolumny, a DESC
mówi się na odwrotnej wyniki (czyli umieszczenie ostatni pierwsze). Następnie LIMIT 1
każe mu przejść tylko jeden wiersz.
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)
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ś ... :)
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)
Możesz użyć last_value: SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...
Testuję go w jednej z moich baz danych i działa zgodnie z oczekiwaniami.
Możesz również sprawdzić dokumentację tutaj: https://msdn.microsoft.com/en-us/library/hh231517.aspx
Spróbuj tego
SELECT id from comission_fees ORDER BY id DESC LIMIT 1
LIMIT
. To powracaIncorrect syntax near LIMIT
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;
select top 1
bez 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.
OFFSET
i FETCH NEXT
są funkcją SQL Server 2012 umożliwiającą stronicowanie SQL podczas wyświetlania wyników.
OFFSET
Argument ten jest wykorzystywany do określenia, wiersz wyjściowe do rzędów obie z wyników i FETCH
argumentem 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
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 )
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
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')
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.
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)