Press "Enter" to skip to content

SQL Come leggere l’ennesimo record di una tabella

A seguito di una domanda postami, scrivo qui, al solito anche per ricordarmelo, come si fa a leggere una specifica riga di una tabella in base ad un arbitrario ordinamento.

Esistendo solo la clausola SELECT TOP non è sempre possibile farlo, ma dalla versione 2005 di SQL Server esiste la funzione Row_Number, che può darci una mano in questo caso. Il test l’ho fatto sulla tabella Authors del famigerato ed antico db di test Pubs, fornito con SQL Server fino alla versione 2000.

Ecco come impostare la query:

SELECT [au_id]
      ,[au_lname]
      ,[au_fname]
      ,[phone]
      ,[address]
      ,[city]
      ,[state]
      ,[zip]
      ,[contract]
      ,[brthdate]
    , row_number() over( order by au_lname) as rnum
  FROM [pubs].[dbo].[authors]

In questo caso, Otteniamo la colonna rnum che contiene un contatore che numera le righe della tabella in ordine di Cognome, volendo, questa funzione ci permette anche di numerare le righe per gruppi, ovvero, se sostituiamo la riga di Row_Number con questa:

    , row_number() over(partition by [state] order by [state]) as rnum

Otteniamo che i nostri autori sono numerati da 1 a n per ognuno degli stati presenti.

Fatta questa query è necessario incapsularla in una seconda select per poter ottenere la riga che ci interessa.

select * from (
SELECT [au_id]
      ,[au_lname]
      ,[au_fname]
      ,[phone]
      ,[address]
      ,[city]
      ,[state]
      ,[zip]
      ,[contract]
      ,[brthdate]
    , row_number() over( order by au_lname) as rnum
  FROM [pubs].[dbo].[authors]) aut
WHERE aut.rnum = 15

In questo caso otteniamo il quindicesimo record in ordine di cognome, cambiando la clausola order by possiamo decidere di  leggere il dodicesimo in ordine di numero telefonico, o di codice contratto e così via.