<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlserver.ro/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>T-SQL</title><link>http://sqlserver.ro/forums/15/ShowForum.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Re: Ultimele 2 randuri in coloane</title><link>http://sqlserver.ro/forums/thread/9288.aspx</link><pubDate>Tue, 26 Jun 2012 11:16:07 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:9288</guid><dc:creator>B_gd_n[ ]Sahlean</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/9288.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=9288</wfw:commentRss><description>Pp. că prin ultimele două rânduri înțelegi ultimele două înregistrări inserate.&lt;br&gt;
1) Dacă ai un câmp IDENTITY poți să folosești (&lt;a href="http://sqlfiddle.com/#%213/793f8/2"&gt;demo online&lt;/a&gt;):&lt;br&gt;
&lt;font face="Courier New"&gt;CREATE TABLE Produs(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ID INT IDENTITY(2,2) PRIMARY KEY,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; GrupaID INT NOT NULL,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Denumire NVARCHAR(50) NOT NULL,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; PretUnitar NUMERIC(9,2) NOT NULL&lt;br&gt;
);&lt;br&gt;
  &lt;br&gt;
INSERT&amp;nbsp;&amp;nbsp;&amp;nbsp; Produs (GrupaID, Denumire, PretUnitar)&lt;br&gt;
SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp; 1, 'A', 1.1&lt;br&gt;
UNION ALL&lt;br&gt;
SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp; 1, 'BB', 2.2&lt;br&gt;
UNION ALL&lt;br&gt;
SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp; 1, 'CCC', 3.3&lt;br&gt;
UNION ALL&lt;br&gt;
SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp; 2, 'D', 4.4&lt;br&gt;
UNION ALL&lt;br&gt;
SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp; 2, 'EE', 5.5&lt;br&gt;
UNION ALL&lt;br&gt;
SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp; 2, 'FFF', 6.6&lt;br&gt;
UNION ALL&lt;br&gt;
SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp; 2, 'GGGG', 7.7;&lt;br&gt;
  &lt;br&gt;
SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br&gt;
FROM&lt;br&gt;
(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp; p.ID,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; p.GrupaID,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; p.Denumire,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; p.PretUnitar,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ROW_NUMBER() OVER(PARTITION BY p.GrupaID ORDER BY p.ID DESC) RowNum&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&amp;nbsp;&amp;nbsp;&amp;nbsp; dbo.Produs p&lt;br&gt;
) src&lt;br&gt;
WHERE&amp;nbsp;&amp;nbsp;&amp;nbsp; src.RowNum &amp;lt;= 2&lt;br&gt;
ORDER BY src.ID&lt;/font&gt;&lt;br&gt;
&lt;br&gt;
Posibile probleme pot apare dacă sunt inserate valori explicite în câmpul $IDENTITY (&lt;span id="nsrTitle"&gt;vezi SET IDENTITY_INSERT):&lt;br&gt;
  &lt;br&gt;
  &lt;font face="Courier New"&gt;DELETE Produs&lt;br&gt;
WHERE ID = 2&lt;br&gt;
    &lt;br&gt;
SET IDENTITY_INSERT dbo.Produs ON&lt;br&gt;
INSERT&amp;nbsp;&amp;nbsp;&amp;nbsp; Produs (ID, GrupaID, Denumire, PretUnitar)&lt;br&gt;
SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp; 2, 1, '*K*', 1.1&lt;br&gt;
SET IDENTITY_INSERT dbo.Produs OFF&lt;/font&gt;&lt;br&gt;
&lt;/span&gt;&lt;br&gt;
2) Dacă ai un câmp CreateDate / DataOraInserare DATETIME NOT NULL DEFAULT GETDATE() atunci poți să folosești&lt;br&gt;
&lt;font face="Courier New"&gt;ROW_NUMBER() OVER(PARTITION BY p.GrupaID ORDER BY p.DataOraInserare DESC, p.ID DESC ) RowNum&lt;/font&gt;.&lt;br&gt;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.&lt;br&gt;
&lt;br&gt;Şi în acest caz se pot insera/modifica ușor valori(le) DataOraInserare.&lt;br&gt;</description></item><item><title>Ultimele 2 randuri in coloane</title><link>http://sqlserver.ro/forums/thread/9287.aspx</link><pubDate>Tue, 26 Jun 2012 07:51:23 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:9287</guid><dc:creator>ssandu</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/9287.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=9287</wfw:commentRss><description>Salut&lt;br&gt;Incerc sa extrag ultimele 2 randuri dintr-un tabel grupate pe un camp iar din cele 2 randuri sa iau o coloana&lt;br&gt;Am reusit ceva de genul&lt;br&gt;&lt;br&gt;WITH Temp (RANK, CNP, Data, Suma)&lt;br&gt;AS&lt;br&gt;(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT ROW_NUMBER() OVER(PARTITION BY CNP ORDER BY f.pkey DESC) AS 'Rank',&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f.cnp,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f.Data,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f.Suma&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&amp;nbsp;&amp;nbsp; Facturi f&lt;br&gt;)&lt;br&gt;SELECT f1.cnp,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f1.Data,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f1.Suma AS actual,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f2.Suma AS penultimul&lt;br&gt;FROM&amp;nbsp;&amp;nbsp; Temp f1,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Temp f2&lt;br&gt;WHERE&amp;nbsp; f1.Rank = f2.Rank - 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND f1.CNP = f2.cnp&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND f1.rank = 1&lt;br&gt;UNION ALL&lt;br&gt;SELECT f1.cnp,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MIN(f1.Data) AS Data,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUM(f1.Suma)&amp;nbsp; AS actual,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 AS penultimul&lt;br&gt;FROM&amp;nbsp;&amp;nbsp; Temp f1&lt;br&gt;GROUP BY&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cnp&lt;br&gt;HAVING COUNT(f1.CNP) = 1&lt;br&gt;&lt;br&gt;dar am impresia ca este cam complicat, mai ales daca va trebui sa folosesc mai multe coloane.&lt;br&gt;Aveti vreo idee mai simpla ?&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;</description></item></channel></rss>