Como ler a última linha com SQL Server

89

Qual é a maneira mais eficiente de ler a última linha com o SQL Server?

A tabela é indexada em uma chave única - os valores da chave "inferior" representam a última linha.

rp.
fonte

Respostas:

181

Se estiver usando MS SQL, você pode tentar:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 
EggyBach
fonte
17
E se você tiver 5 milhões de registros no banco de dados! : - \
deepdive
5
Se a tabela for indexada na coluna de classificação, o SQL apenas lerá a última linha da tabela. Nenhuma classificação cara ou varredura completa da tabela é necessária.
Spivonious
Se eu precisar obter os últimos 1000 registros, como faço para obter, você pode dizer
Sri
1
@Sri Você SELECT TOP 1000 * FROM table_name ORDER BY column_name DESCdeve executar e deve produzir os últimos 1000 registros.
Rod Argumedo
22
select whatever,columns,you,want from mytable
 where mykey=(select max(mykey) from mytable);
Adam Pierce
fonte
qual é a minha chave? No meu caso?
Mowgli
@Mowgli mykeyé o índice da sua tabela
Cliff Burton
2
Se mykeyfor um identificador exclusivo, essa abordagem não ajudaria
Iman Mahmoudinasab
18

Você precisará de algum tipo de coluna de identificação exclusiva em sua tabela, como uma chave primária de autopreenchimento ou uma coluna de data e hora (de preferência a chave primária). Então você pode fazer isso:

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

O ORDER BY columninstrui a reorganizar os resultados de acordo com os dados dessa coluna e o DESCinstrui a reverter os resultados (colocando assim o último primeiro). Depois disso, o LIMIT 1diz para passar de volta apenas uma linha.

Willurd
fonte
5
Uau, duro, a pergunta original nem mesmo dizia SQL Server especificamente. A solução acima é perfeitamente legítima, embora o SQL Server use palavras diferentes para descrever o mesmo conceito. +1
Greg Hewgill,
@VinkoVrsalovic, não significa que a resposta seja inútil, ao contrário, mesmo depois de uma década. Você concorda comigo, senhor?
snr
1
Este é o problema da comunicação escrita - é fácil de ler muito mais severamente do que o pretendido, especialmente quando é breve! Agora sei disso e entendo que a responsabilidade recai sobre o escritor. Portanto, se eu escrevesse isso hoje, diria: "Essa é a ideia, embora você precise usar TOP em vez de LIMIT para SQL Server, já que esse é o mecanismo DMBS identificado na pergunta. Consulte docs.microsoft.com / en-us / sql / t-sql / queries /… "@snr
Vinko Vrsalovic
11

Se alguma de sua identificação estiver em ordem, estou assumindo que haverá alguma ordem em seu banco de dados

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

Lionel Messi
fonte
4

Acho que a consulta abaixo funcionará para SQL Server com desempenho máximo, sem qualquer coluna classificável

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

Espero que você tenha entendido ... :)

Considere isso feito
fonte
Esta é a melhor solução quando você não pode classificar DESC e precisa apenas da última linha conforme ela é retornada.
jjthebig1 de
3

Tentei usar last in sql query no SQl Server 2008, mas deu este erro: "'last' não é um nome de função embutido reconhecido."

Então acabei usando:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

para obter o Id da última linha. Também se pode usar

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
fonte
3

Você pode usar last_value: SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...

Eu testei em um dos meus bancos de dados e funcionou conforme o esperado.

Você também pode verificar a documentação aqui: https://msdn.microsoft.com/en-us/library/hh231517.aspx

Gil gomes
fonte
2

Tente isto

SELECT id from comission_fees ORDER BY id DESC LIMIT 1
Ashish pathak
fonte
1
Como um comentário acima de @Vinko Vrsalovic diz que MSSQL não usa LIMIT. Este retornaIncorrect syntax near LIMIT
frmbelz
1

Para recuperar a última linha de uma tabela para o banco de dados MS SQL 2005, você pode usar a seguinte consulta:

select top 1 column_name from table_name order by column_name desc; 

Nota: Para obter a primeira linha da tabela para o banco de dados MS SQL 2005, você pode usar a seguinte consulta:

select top 1 column_name from table_name; 
Neolisk
fonte
2
select top 1sem um pedido de não é uma maneira confiável de obter o primeiro registro. Se você não fizer um pedido até, dará permissão ao SQL para fornecer qualquer registro que desejar.
Code Magician
1

OFFSETe FETCH NEXTsão um recurso do SQL Server 2012 para obter paginação SQL enquanto exibe os resultados.

O OFFSETargumento é usado para decidir a linha inicial para retornar linhas de um resultado e o FETCHargumento é usado para retornar um conjunto de número de linhas.

SELECT *
FROM table_name
ORDER BY unique_column desc
OFFSET 0 Row
FETCH NEXT 1 ROW ONLY
Jignesh Bhayani
fonte
0
SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)
manas
fonte
1
A melhor resposta da mesma forma, podemos obter a primeira linha SELECT * de funcionários, onde [ID do funcionário] = ALL (SELECT MIN ([ID do funcionário]) dos funcionários)
manas
0

É assim que você obtém o último registro e atualiza um campo no Access DB.

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

Muhammad Sajid
fonte
0

Se você não tiver nenhuma coluna ordenada, pode usar o id físico de cada linha:

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
fonte
0

Se você tiver uma tabela Replicada, poderá ter Identity = 1000 em localDatabase e Identity = 2000 em clientDatabase, portanto, se você pegar o último ID, poderá encontrar sempre o último do cliente, não o último do banco de dados conectado atual. Portanto, o melhor método que retorna o último banco de dados conectado é:

SELECT IDENT_CURRENT('tablename')
user3096335
fonte
0

Bem, eu não estou obtendo o "último valor" em uma tabela, estou obtendo o último valor por instrumento financeiro. Não é a mesma coisa, mas acho que é relevante para alguns que estão procurando saber "como é feito agora". Eu também usei RowNumber () e CTE's e antes disso para simplesmente pegar 1 e ordenar por [coluna] desc. no entanto, não precisamos mais ...

Estou usando o SQL Server 2017, estamos gravando todos os ticks em todas as bolsas globalmente, temos aproximadamente 12 bilhões de ticks por dia, armazenamos cada Bid, ask e trade, incluindo os volumes e os atributos de um tick (licitar, pedir, negociar ) de qualquer uma das trocas fornecidas.

Temos 253 tipos de dados de ticks para qualquer contrato dado (principalmente estatísticas) nessa tabela, o último preço negociado é o tipo de tick = 4, portanto, quando precisamos obter o "último" do Preço que usamos:

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

Você pode ver o plano de execução no meu sistema de desenvolvimento, ele executa de forma bastante eficiente, em 4 segundos enquanto o ETL de importação de câmbio está bombeando dados para a tabela, haverá alguns bloqueios me deixando mais lento ... é assim que os sistemas ao vivo funcionam. plano de execução contra 85.697.659 linhas

Walter Vehoeven
fonte
-1
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
Hamza Abuzahra
fonte
Bem vindo ao site. Isso poderia ser um comentário (se você tivesse o representante), você se importaria de expandi-lo adicionando algum texto para explicar como ele resolve o problema e para diferenciá-lo das 10 respostas anteriores?
gung - Reintegrar Monica
-5

Tenho certeza de que é:

SELECT last(column_name) FROM table

Porque eu uso algo semelhante:

SELECT last(id) FROM Status
maniakk
fonte
7
Last () não é uma função de sql-server
Taryn