Come leggere l'ultima riga con SQL Server


88

Qual è il modo più efficiente per leggere l'ultima riga con SQL Server?

La tabella è indicizzata su una chiave univoca: i valori delle chiavi "inferiori" rappresentano l'ultima riga.

Risposte:


180

Se stai usando MS SQL, puoi provare:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

17
E se avessi 5 milioni di record in DB! : - \
immersione profonda

4
Se la tabella è indicizzata nella colonna di ordinamento, SQL leggerà solo l'ultima riga della tabella. Non è necessario alcun ordinamento costoso o scansione completa della tabella.
Spivonious

Se ho bisogno di ottenere gli ultimi 1000 record come posso ottenerlo, puoi dirlo
Sri

1
@Sri Dovresti eseguire SELECT TOP 1000 * FROM table_name ORDER BY column_name DESCe produrre gli ultimi 1000 record.
Rod Argumedo

22
select whatever,columns,you,want from mytable
 where mykey=(select max(mykey) from mytable);

cos'è mykey? nel mio caso?
Mowgli

@Mowgli mykeyè l'indice del tuo tavolo
Cliff Burton

2
Se mykeyè un identificatore univoco questo approccio non sarebbe di aiuto
Iman Mahmoudinasab

18

Avrai bisogno di una sorta di colonna di identificazione univoca nella tua tabella, come una chiave primaria a riempimento automatico o una colonna datetime (preferibilmente la chiave primaria). Quindi puoi farlo:

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

Gli ORDER BY columndice di riorganizzare i risultati in base ai dati di quella colonna e gli DESCdice di invertire i risultati (mettendo così l'ultimo per primo). Dopodiché, gli LIMIT 1dice di tornare indietro di una sola riga.


6
MSSQL non utilizza LIMIT
Vinko Vrsalovic

4
Wow, dura, la domanda originale non diceva nemmeno SQL Server in modo specifico. La soluzione di cui sopra è perfettamente legittima anche se SQL Server utilizza parole diverse per descrivere lo stesso concetto. +1
Greg Hewgill

11

Se alcuni dei tuoi ID sono in ordine, presumo che ci sarà un certo ordine nel tuo db

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


4

Penso che la query seguente funzionerà per SQL Server con le massime prestazioni senza alcuna colonna ordinabile

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

Spero tu l'abbia capito ... :)


Questa è la soluzione migliore quando non puoi ordinare DESC e hai solo bisogno dell'ultima riga quando viene restituita.
jjthebig1

3

Ho provato a utilizzare last in sql query in SQl server 2008 ma dà questo errore: "'last' non è un nome di funzione integrato riconosciuto."

Quindi ho finito per usare:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

per ottenere l'ID dell'ultima riga. Si potrebbe anche usare

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

Prova questo

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

1
Come un commento sopra di @Vinko Vrsalovic dice che MSSQL non usa LIMIT. Questo ritornaIncorrect syntax near LIMIT
frmbelz

1

Per recuperare l'ultima riga di una tabella per il database MS SQL 2005, è possibile utilizzare la seguente query:

select top 1 column_name from table_name order by column_name desc; 

Nota: per ottenere la prima riga della tabella per il database MS SQL 2005, è possibile utilizzare la seguente query:

select top 1 column_name from table_name; 

2
select top 1senza un ordine di non è un modo affidabile per ottenere il primo record. Se non metti in ordine da, dai il permesso a SQL di darti qualsiasi record desideri.
Code Magician,

1

OFFSETe FETCH NEXTsono una funzionalità di SQL Server 2012 per ottenere il paging SQL durante la visualizzazione dei risultati.

L' OFFSETargomento viene utilizzato per decidere la riga iniziale per restituire righe da un risultato e l' FETCHargomento viene utilizzato per restituire un insieme di numero di righe.

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
Allo stesso modo, la migliore risposta è possibile ottenere la prima riga SELEZIONA * da Dipendenti dove [ID dipendente] = TUTTI (SELEZIONA MIN ([ID dipendente]) dai dipendenti)
manas

0

In questo modo si ottiene l'ultimo record e si aggiorna un campo in Access DB.

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


0

Se non hai una colonna ordinata, puoi utilizzare l'id fisico di ciascuna riga:

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 hai una tabella replicata, puoi avere Identity = 1000 in localDatabase e Identity = 2000 in clientDatabase, quindi se prendi l'ultimo ID potresti trovare sempre l'ultimo dal client, non l'ultimo dal database connesso corrente. Quindi il metodo migliore che restituisce l'ultimo database connesso è:

SELECT IDENT_CURRENT('tablename')

0

Beh, non ottengo l '"ultimo valore" in una tabella, ottengo l'ultimo valore per strumento finanziario. Non è lo stesso, ma immagino sia rilevante per alcuni che stanno cercando di cercare "come è fatto ora". Ho anche usato RowNumber () e CTE e prima ancora per prendere semplicemente 1 e ordinare per [colonna] desc. tuttavia non abbiamo più bisogno di ...

Sto usando SQL Server 2017, stiamo registrando tutti i tick su tutte le borse a livello globale, abbiamo ~ 12 miliardi di tick al giorno, memorizziamo ogni offerta, domanda e scambio inclusi i volumi e gli attributi di un segno di spunta (offerta, domanda, scambio ) di uno qualsiasi degli scambi.

Abbiamo 253 tipi di dati sui tick per un dato contratto (principalmente statistiche) in quella tabella, l'ultimo prezzo scambiato è il tipo tick = 4 quindi, quando abbiamo bisogno di ottenere l '"ultimo" del prezzo, usiamo:

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

Puoi vedere il piano di esecuzione sul mio sistema di sviluppo che viene eseguito in modo abbastanza efficiente, viene eseguito in 4 secondi mentre l'ETL di importazione dello scambio sta pompando i dati nella tabella, ci sarà un blocco che mi rallenta ... è così che funzionano i sistemi live. piano di esecuzione contro 85.697.659 righe


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

Benvenuto nel sito. Questo potrebbe essere un commento (se avessi il rappresentante), ti dispiacerebbe espanderlo aggiungendo del testo per spiegare come risolve il problema e per differenziarlo dalle 10 risposte precedenti?
gung - Ripristina Monica il

-5

Sono abbastanza sicuro che sia:

SELECT last(column_name) FROM table

Perché uso qualcosa di simile:

SELECT last(id) FROM Status

7
Last () non è una funzione di sql-server
Taryn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.