[ kaleboyzz @ 02.11.2012. 21:10 ] @
Pozdrav svima!

Imam sledeći resultset

KolonaA KolonaB
____________________
1 | AAAAA
2 | AAAAA
3 | AAAAA
4 | BBBBB
5 | BBBBB
6 | CCCCC
7 | CCCCC
8 | CCCCC
9 | DDDDD
10 | AAAAA
11 | AAAAA
12 | BBBBB

kako napisati select upit da bi se dobio sledeći result set

KolonaA KolonaB KolonaC
_________________________________
1 | AAAAA | AAAAA
2 | AAAAA |
3 | AAAAA |
4 | BBBBB | BBBBB
5 | BBBBB |
6 | CCCCC | CCCCC
7 | CCCCC |
8 | CCCCC |
9 | DDDDD | DDDDD
10 | AAAAA | AAAAA
11 | AAAAA |
12 | BBBBB | BBBBB

tačnije, ako se trenutni red u koloni KolonaB razlikuje od prethodnog, da vrednost istog ispiše u koloni KolonaC, inače da ispiše prazan string.
[ dusans @ 02.11.2012. 23:09 ] @
Ovako nekako...

Code:

SELECT 
    TT.KolonaA, 
    TT.KolonaB,
    CASE WHEN TT.KolonaB = TP.KolonaB THEN NULL ELSE TT.KolonaB END AS KolonaC
FROM    
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY KolonaA) AS Indeks
    FROM Tabela
) AS TT
LEFT OUTER JOIN
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY KolonaA) AS Indeks
    FROM Tabela
) AS TP
ON (TT.Indeks - 1= TP.Indeks)
ORDER BY KolonaA
[ kaleboyzz @ 03.11.2012. 06:11 ] @
To je to. Hvala! :)
[ HladankaoLed @ 02.12.2012. 13:53 ] @
Citat:
dusans:
Ovako nekako...

Code:

SELECT 
    TT.KolonaA, 
    TT.KolonaB,
    CASE WHEN TT.KolonaB = TP.KolonaB THEN NULL ELSE TT.KolonaB END AS KolonaC
FROM    
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY KolonaA) AS Indeks
    FROM Tabela
) AS TT
LEFT OUTER JOIN
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY KolonaA) AS Indeks
    FROM Tabela
) AS TP
ON (TT.Indeks - 1= TP.Indeks)
ORDER BY KolonaA



Samo da dodam jedno elegantno resenje koje radi samo u SQL Server 2012 i koje koristi poboljsanja u najnovijoj SQL Server verziji...

Code:

SELECT KolonaA, KolonaB, NULLIF(KolonaB,LAG(KolonaB) OVER(ORDER BY KolonaA)) AS KolonaC 
FROM Tabela
[ MatezYU @ 14.03.2013. 13:49 ] @
A zar nije ovako jednostavnije u verziji MS SQL < 2012 ?

select t1.KolonaA, t1.KolonaB, KolonaC = case when t1.KolonaB <> isnull(t2.KolonaB,'') then t1.KolonaBelse '' end
from Tabela t1
left join Tabela t2 on t1.id = t2.id + 1
[ MatezYU @ 14.03.2013. 13:53 ] @
Paron ovako:

select t1.KolonaA, t1.KolonaB, KolonaC = case when t1.KolonaB <> isnull(t2.KolonaB,'') then t1.KolonaBelse else '' end
from Tabela t1
left join Tabela t2 on t1.id = t2.id + 1
[ Zidar @ 15.03.2013. 14:00 ] @
Ovo bre ispade kao mozgalica. Super. Steta je sto nismo dobili CREATE TABLE i INSERT INTO da se obezbedi nesto test podataka, pa da vidimo da li i kako ponudjena resenja zaista rade. Bez stvarne tabele i test podataka, sve je samo pseudo kod. Ako postavljac teme ulozi malo truda i da nam test tabelu sa test podacima, svi bismo imali konkretnu korist od ove teme. Ovako, samo postavljac ima koristi. Forumi su za opste dobro, nije resavacnica domacih ili poslovnih zadataka.
[ kaleboyzz @ 25.03.2013. 07:30 ] @
Apsolutno se slažem.

Međutim, rešenjem zadatka drugi posetioci teme mogu da reše isti ili sličan, ili pak nauče nešto (ako to već ne znaju). Samim tim "dobija" više njih, ne samo postavljč teme.

Momci, hvala na trudu i odvojenom vremenu za rešavanje problema.

Problem nije toliko komplikovan da bi zahtevao podrobna testiranja. Izvršavanje upita je testirano na R2-ci na ne više od 6000 redova tako da varijante rešenja koje su napisali MatezYU i dusans rade izuzetno brzo. Pretpostavljam da varijanta HladnogkaoLed radi isto tako.

Obezbediću jednu tabelu sa daleko više podatka, pa možemo testirati sve varijante. :)







[ Zidar @ 25.03.2013. 18:49 ] @
Zahvaljujem kaleboyz na razumevanju :-)

Citat:
Problem nije toliko komplikovan da bi zahtevao podrobna testiranja. Izvršavanje upita je testirano na R2-ci na ne više od 6000 redova tako da varijante rešenja koje su napisali MatezYU i dusans rade izuzetno brzo.

1) Ne postoji problem dovoljno prost da ne zhateva podrobna testiranja.
2) 6000 redova je absolutno NISTA. Sest miliona je nesto, iako ne mnogo, ali to naravno na forumu ne moemo da rdaimo.
3) Uz realne podatke ili izmisljene s razlogom da se saplete ponudjeni kod, mozda bi se nasla neka kombinacija za koju neka od resenja ne bi radila uopste, ili bi davala pogresan rezultat. Testiranje nije samo kad se pusti nekoliko redova koji 'normalno' izgledaju. Probaj sa NULL vrednostima, praznim redovima, sortirano, nesortirano, specijalni slucajevi...

:-)
[ kaleboyzz @ 25.03.2013. 19:25 ] @
Naravno. Potpuno si upravu. :)

Nisam očekivao da će tema ovoliko daleko otići, da ćemo se baviti redovnim testiranjem. ;)