Press "Enter" to skip to content

Filtrare le righe con un certo Rank dopo averlo generato

Un esempio collegato ad un post precedente per filtrare una query con una funzione di Ranking ed estrarre solo le righe rispondenti al rank prestabilito.

Sul post Usare la funzione Rank per estrarre una lista di righe con la data più alta ho mostrato come usare il ranking per verificare qual’è la data più alta o la più bassa in un determinato range, ma non ho mostrato come poi filtrare in base al ranking generato come mi è stato giustamente fatto osservare da Maurizio nei commenti, perciò ecco come si fa:

SELECT [IDListinoRg]
      ,[IDListino]
      ,[IDArticolo]
      ,[Prezzo]
FROM (
   SELECT [IDListinoRg]
      ,[IDListino]
      ,[IDArticolo]
      ,[Prezzo]
      ,[ValidoDal]
      ,RANK() OVER (PARTITION BY IDLISTINO, IDARTICOLO ORDER BY ValidoDal DESC) DATERANK
  FROM [paperinik].[dbo].[TbListiniRg]) Li
WHERE
    DateRank = 1

perché non mettere l’espressione di Rank direttamente nella Where? Perché si ottiene un errore, non è permesso probabilmente per le modalità con cui la funzione di Rank viene elaborata, pertanto bisogna fare una select nidificata.

Ovviamente questo tipo di Query non è efficientissima, però da una soluzione ad un problema reale.