Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 9 odgovora
  • 3.336 pregleda

Najnovija ↓

Rekurzija CTE ili običan select 02.11.2012. u 22:10 · pre 170 meseci #1
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.
Re: Rekurzija CTE ili običan select 03.11.2012. u 00:09 · pre 170 meseci #2
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
Re: Rekurzija CTE ili običan select 02.12.2012. u 14:53 · pre 169 meseci #4
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
Potpis
Sad šta je tu je. A možda će da dođe i ova tvoja tetka iz Bosanske Krupe.
Re: Rekurzija CTE ili običan select 14.03.2013. u 14:49 · pre 165 meseci #5
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
Re: Rekurzija CTE ili običan select 14.03.2013. u 14:53 · pre 165 meseci #6
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
Re: Rekurzija CTE ili običan select 15.03.2013. u 15:00 · pre 165 meseci #7
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.
Re: Rekurzija CTE ili običan select 25.03.2013. u 08:30 · pre 165 meseci #8
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. :)







Re: Rekurzija CTE ili običan select 25.03.2013. u 19:49 · pre 165 meseci #9
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...

:-)
Re: Rekurzija CTE ili običan select 25.03.2013. u 20:25 · pre 165 meseci #10
Naravno. Potpuno si upravu. :)

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

Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme