Filtrare le righe con un certo Rank dopo averlo generato

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, 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.

Technorati Tag: ,

Print | posted on sabato 31 luglio 2010 21.31

Feedback

# re: Filtrare le righe con un certo Rank dopo averlo generato

Left by Maurizio at 02/08/2010 9.42
Gravatar ciao Sabrina, ho provato a trovare una
alternativa all'uso di RANK e la soluzione che ho trovato e' questa

SELECT [IDListinoRg]
,[IDListino]
,[IDArticolo]
,[Prezzo]
,[ValidoDal]
FROM [dbo].[TbListiniRg] AS RG
WHERE [ValidoDal] =
(
SELECT MAX([ValidoDal])
FROM [dbo].[TbListiniRg] TMP
WHERE
TMP.IDArticolo = RG.IDArticolo AND
TMP.IDListino = RG.IDListino
)

mi sembra che funzioni.
Se ne hai voglia e tempo provala anche tu
ciao Maurizio

Your comment:





 
Please add 7 and 7 and type the answer here:

Copyright © Sabrina C.

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski