Welcome to Sign in | Join | Help
in Search

Ultimele 2 randuri in coloane

Last post 06-26-2012, 2:16 PM by B_gd_n[ ]Sahlean. 1 replies.
Sort Posts: Previous Next
  •  06-26-2012, 10:51 AM 9287

    Ultimele 2 randuri in coloane

    Salut
    Incerc sa extrag ultimele 2 randuri dintr-un tabel grupate pe un camp iar din cele 2 randuri sa iau o coloana
    Am reusit ceva de genul

    WITH Temp (RANK, CNP, Data, Suma)
    AS
    (
        SELECT ROW_NUMBER() OVER(PARTITION BY CNP ORDER BY f.pkey DESC) AS 'Rank',
               f.cnp,
               f.Data,
               f.Suma
        FROM   Facturi f
    )
    SELECT f1.cnp,
           f1.Data,
           f1.Suma AS actual,
           f2.Suma AS penultimul
    FROM   Temp f1,
           Temp f2
    WHERE  f1.Rank = f2.Rank - 1
           AND f1.CNP = f2.cnp
           AND f1.rank = 1
    UNION ALL
    SELECT f1.cnp,
           MIN(f1.Data) AS Data,
           SUM(f1.Suma)  AS actual,
           0 AS penultimul
    FROM   Temp f1
    GROUP BY
           cnp
    HAVING COUNT(f1.CNP) = 1

    dar am impresia ca este cam complicat, mai ales daca va trebui sa folosesc mai multe coloane.
    Aveti vreo idee mai simpla ?

     

    Sorin Sandu
  •  06-26-2012, 2:16 PM 9288 in reply to 9287

    Re: Ultimele 2 randuri in coloane

    Pp. că prin ultimele două rânduri înțelegi ultimele două înregistrări inserate.
    1) Dacă ai un câmp IDENTITY poți să folosești (demo online):
    CREATE TABLE Produs(
        ID INT IDENTITY(2,2) PRIMARY KEY,
        GrupaID INT NOT NULL,
        Denumire NVARCHAR(50) NOT NULL,
        PretUnitar NUMERIC(9,2) NOT NULL
    );

    INSERT    Produs (GrupaID, Denumire, PretUnitar)
    SELECT    1, 'A', 1.1
    UNION ALL
    SELECT    1, 'BB', 2.2
    UNION ALL
    SELECT    1, 'CCC', 3.3
    UNION ALL
    SELECT    2, 'D', 4.4
    UNION ALL
    SELECT    2, 'EE', 5.5
    UNION ALL
    SELECT    2, 'FFF', 6.6
    UNION ALL
    SELECT    2, 'GGGG', 7.7;

    SELECT    *
    FROM
    (
            SELECT    p.ID,
                    p.GrupaID,
                    p.Denumire,
                    p.PretUnitar,
                    ROW_NUMBER() OVER(PARTITION BY p.GrupaID ORDER BY p.ID DESC) RowNum
            FROM    dbo.Produs p
    ) src
    WHERE    src.RowNum <= 2
    ORDER BY src.ID


    Posibile probleme pot apare dacă sunt inserate valori explicite în câmpul $IDENTITY (vezi SET IDENTITY_INSERT):

    DELETE Produs
    WHERE ID = 2

    SET IDENTITY_INSERT dbo.Produs ON
    INSERT    Produs (ID, GrupaID, Denumire, PretUnitar)
    SELECT    2, 1, '*K*', 1.1
    SET IDENTITY_INSERT dbo.Produs OFF


    2) Dacă ai un câmp CreateDate / DataOraInserare DATETIME NOT NULL DEFAULT GETDATE() atunci poți să folosești
    ROW_NUMBER() OVER(PARTITION BY p.GrupaID ORDER BY p.DataOraInserare DESC, p.ID DESC ) RowNum.
    Pentru că pot apare duplicate în câmpul DataOraInserare mai ai nevoie de un câmp care să-ţi asigure "reproductibilitatea" înregistrărilor astfel sortate şi filtrate.

    Şi în acest caz se pot insera/modifica ușor valori(le) DataOraInserare.
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems