Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Rekurzija CTE ili običan select

[es] :: MS SQL :: Rekurzija CTE ili običan select

[ Pregleda: 2391 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

kaleboyzz
Miodrag Sekulić
.NET developer

Član broj: 175106
Poruke: 31
95.180.6.*



+2 Profil

icon Rekurzija CTE ili običan select02.11.2012. u 21:10 - pre 138 meseci
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.
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: Rekurzija CTE ili običan select02.11.2012. u 23:09 - pre 138 meseci
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
 
Odgovor na temu

kaleboyzz
Miodrag Sekulić
.NET developer

Član broj: 175106
Poruke: 31
95.180.6.*



+2 Profil

icon Re: Rekurzija CTE ili običan select03.11.2012. u 06:11 - pre 138 meseci
To je to. Hvala! :)
 
Odgovor na temu

HladankaoLed
Database Consultant
Vienna, Austria

Član broj: 228937
Poruke: 36
*.5.14.univie.teleweb.at.

Sajt: milossql.wordpress.com


+1 Profil

icon Re: Rekurzija CTE ili običan select02.12.2012. u 13:53 - pre 137 meseci
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

Sad šta je tu je. A možda će da dođe i ova tvoja tetka iz Bosanske Krupe.
 
Odgovor na temu

MatezYU

Član broj: 4114
Poruke: 1586
195.46.53.*



+17 Profil

icon Re: Rekurzija CTE ili običan select14.03.2013. u 13:49 - pre 134 meseci
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
 
Odgovor na temu

MatezYU

Član broj: 4114
Poruke: 1586
195.46.53.*



+17 Profil

icon Re: Rekurzija CTE ili običan select14.03.2013. u 13:53 - pre 134 meseci
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
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Rekurzija CTE ili običan select15.03.2013. u 14:00 - pre 134 meseci
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.
 
Odgovor na temu

kaleboyzz
Miodrag Sekulić
.NET developer

Član broj: 175106
Poruke: 31
46.240.192.*



+2 Profil

icon Re: Rekurzija CTE ili običan select25.03.2013. u 07:30 - pre 134 meseci
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. :)







 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Rekurzija CTE ili običan select25.03.2013. u 18:49 - pre 134 meseci
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...

:-)
 
Odgovor na temu

kaleboyzz
Miodrag Sekulić
.NET developer

Član broj: 175106
Poruke: 31
95.180.45.*



+2 Profil

icon Re: Rekurzija CTE ili običan select25.03.2013. u 19:25 - pre 134 meseci
Naravno. Potpuno si upravu. :)

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

 
Odgovor na temu

[es] :: MS SQL :: Rekurzija CTE ili običan select

[ Pregleda: 2391 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.