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.