175 messaggi dal 14 marzo 2006
salve ...
dovrei estrarre dei valori da una tabella.
In pratica per ogni PARAMETRO dovrei estrarre il dato corrispondente alla DATA più recente

Questa è la tabella:

id  parametro  valore  data
1  A  10  01/06/2014
2  A  20  10/06/2014
3  A  30  20/06/2014
4  B  10  01/07/2014
5  B  20  10/07/2014
6  C  15  15/07/2014




Questo è il risultato che vorrei ottenere:
id  parametro  valore  data
3  A  30  20/06/2014
5  B  20  10/07/2014
6  C  15  15/07/2014



mi date una mano ???
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
puoi risolvere il problema utilizzando una funzionalita' di windowing con partizionamento basata su ROW_NUMBER... per ogni partizione di [Parametro] "numeri ordinalmente" le varie righe in base alla data decrescente... cio' ti permette poi di filtrare ed ottenere, per ogni partizione, le sole righe con ordinale = 1 ...
tipicamente,
SET NOCOUNT ON;
GO
DECLARE @t TABLE (
  Id int,
  Parametro char(1),
  Valore int,
  Data date
  );
INSERT INTO @t
  VALUES ( 1, 'A', 10, '2014-06-01' ), ( 2, 'A', 20, '2014-06-10' ), ( 3, 'A', 30, '2014-06-20' )
    , ( 4, 'B', 10, '2014-07-01' ), ( 5, 'B', 20, '2014-07-10' )
    , ( 6, 'C', 15, '2014-07-15' );

WITH cte AS (
  SELECT t.Id, t.Parametro, t.Valore, t.Data
    , ROW_NUMBER() OVER (PARTITION BY t.Parametro ORDER BY t.Data DESC) AS [r]
    FROM @t t
  )
  SELECT cte.Id, cte.Parametro, cte.Data, cte.Valore
    FROM cte
    WHERE cte.r = 1
    ORDER BY cte.Parametro;
--<-------
Id          Parametro Data       Valore
----------- --------- ---------- -----------
3           A         2014-06-20 30
5           B         2014-07-10 20
6           C         2014-07-15 15


saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
175 messaggi dal 14 marzo 2006
Perfetto ! sembra funzionare ...

l'unica questione è che se eseguo la query passandogli un parametro ottengo il risultato voluto.

Quando questa query è richiamata più volte per ogni parametro (all'interno della pagina) funziona solo la prima volta e poi non restituisce niente.

C'è un modo per ... non so come dire ... 'resettarla' ??

Può esserci qualcosa che 'si trascina dietro' ???

Perdona la terminologia !
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
non ho capito :)
tu esegui N volte
WITH cte AS (
  SELECT t.Id, t.Parametro, t.Valore, t.Data
    , ROW_NUMBER() OVER (PARTITION BY t.Parametro ORDER BY t.Data DESC) AS [r]
    FROM @t t
    WHERE t.Parametro = @Param -- <--- questo filtro ???
  )
  SELECT cte.Id, cte.Parametro, cte.Data, cte.Valore
    FROM cte
    WHERE cte.r = 1;


??
al di la' di cio', non c'e' una "cache" valida :)
ci sara' sicuramente un piano di esecuzione che viene riutilizzato, magari con performance non ottimali in base alla dispersione dei dati in base all'attributo Parametro, ma non c'e' bisogno di "resettare" il codice in se'...
se riesci spiega meglio perche' non ho compreso...
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.