Estrarre righe con un valore specifico

di il
2 risposte

Estrarre righe con un valore specifico

Avendo una tabella con questi dati

NUMEROETIDIML
2177501700
2177501500
2177502700
2177502500
21775031400
21775041428
217750450
217750450

Come potrei fare l'estrazione per avere questo risultato?

NUMEROETIDIML
2177501700
2177502700
21775031400
21775041428

Praticamente per ogni valore della colonna ETI estrarre solo la riga con il valore maggiore della colonna DIML

Grazie in anticipo

2 Risposte

  • Re: Estrarre righe con un valore specifico

    Salve,

    puoi utilizzare un MAX partizionato per Numero, Eti, per poi scartare in DISTINCT i duplicati…

    oppure puoi utilizzare un'aggregazione windowing sempre partizionata per ordinare in base a Diml, e scartare le righe oltre la #r = 1

    ad esempio;

    PRINT 'MAX over partintion con distinct per rimozione duplicati';
    SELECT DISTINCT Numero, Eti, MAX(Diml) OVER (PARTITION BY Numero, Eti) AS Diml
    FROM dbo.t
    ORDER BY Numero, Eti;
    
    
    PRINT 'windowing con ROW_NUMBER partizionato e filtro di esclusione scarti';
    WITH cte AS (
    SELECT Numero, Eti, Diml, ROW_NUMBER() OVER (PARTITION BY Numero, Eti ORDER BY Diml DESC) AS r
     FROM dbo.t
    )
    SELECT t.Numero, t.Eti, t.Diml
     FROM dbo.t
      JOIN cte ON cte.Numero = t.Numero
       AND cte.Eti = t.Eti
       AND cte.Diml = t.Diml
     WHERE cte.r = 1
     ORDER BY t.Numero, t.Eti;

    salutoni romagnoli
    -- 
    Andrea

  • Re: Estrarre righe con un valore specifico

    10/02/2023 - asql ha scritto:


    Salve,

    puoi utilizzare un MAX partizionato per Numero, Eti, per poi scartare in DISTINCT i duplicati…

    oppure puoi utilizzare un'aggregazione windowing sempre partizionata per ordinare in base a Diml, e scartare le righe oltre la #r = 1

    ad esempio;

    PRINT 'MAX over partintion con distinct per rimozione duplicati';
    SELECT DISTINCT Numero, Eti, MAX(Diml) OVER (PARTITION BY Numero, Eti) AS Diml
    FROM dbo.t
    ORDER BY Numero, Eti;
    
    
    PRINT 'windowing con ROW_NUMBER partizionato e filtro di esclusione scarti';
    WITH cte AS (
    SELECT Numero, Eti, Diml, ROW_NUMBER() OVER (PARTITION BY Numero, Eti ORDER BY Diml DESC) AS r
     FROM dbo.t
    )
    SELECT t.Numero, t.Eti, t.Diml
     FROM dbo.t
      JOIN cte ON cte.Numero = t.Numero
       AND cte.Eti = t.Eti
       AND cte.Diml = t.Diml
     WHERE cte.r = 1
     ORDER BY t.Numero, t.Eti;

    salutoni romagnoli
    -- 
    Andrea

    Grazie 1000, lo provo subito!

Devi accedere o registrarti per scrivere nel forum
2 risposte