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.

Respostas:


181

Se estiver usando MS SQL, você pode tentar:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

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);

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.


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)


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 ... :)


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)


2

Tente isto

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

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; 

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

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

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 )


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

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')

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


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

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

7
Last () não é uma função de sql-server
— Taryn
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.