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

Mozgalica Br. 12

[es] :: Baze podataka :: Mozgalica Br. 12

[ Pregleda: 3310 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Zidar
Canada

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



+79 Profil

icon Mozgalica Br. 1214.03.2008. u 17:34 - pre 195 meseci
Imamo ovakav zadatak:

Data je tabela Studenti:
Code:

CREATE TABLE Studenti
(Student varchar(10) NOT NULL PRIMARY KEY
, Razred varchar(1) NOT NULL CHECK(Razred IN ('A','B'))
, PkgType int NOT NULL CHECK (PkgType In (0,1,2,3))
, StudNum int  NULL CHECK (StudNum > 0)
)
GO
CREATE UNIQUE INDEX IX_RazNum ON Studenti  (Razred,StudNum)
GO

Treba dodeliti StudNum tako da se studenti budu sortirani po pravilu (Razred,PkgType,StudNum)

Ovako je programer popunio u tabelu:
Code:

INSERT INTO Studenti VALUES ('Ana','A',0,1)
INSERT INTO Studenti VALUES ('Branka','A',0,2)
INSERT INTO Studenti VALUES ('Ceca','A',1,3)
INSERT INTO Studenti VALUES ('Dragana','A',1,4)
INSERT INTO Studenti VALUES ('Ema','B',0,4)
INSERT INTO Studenti VALUES ('Fatima','B',0,5)
INSERT INTO Studenti VALUES ('Goca','B',1,2)
INSERT INTO Studenti VALUES ('Hamida','B',1,3)
INSERT INTO Studenti VALUES ('Ivana','B',1,1)

Da li je programer ispostovao pravilo o sortiranju?

Ocigledno da nije, jer:
Code:

SELECT * FROM Studenti 
ORDER BY razred, PkgType, StudNum

daje

Student    Razred     PkgType     StudNum
---------- ------ ----------- -----------
Ana        A                0           1
Branka     A                0           2
Ceca       A                1           3
Dragana    A                1           4
Ema        B                0           4
Fatima     B                0           5
Ivana      B                1           1
Goca       B                1           2
Hamida     B                1           3

(9 row(s) affected)

Pogledajte razred = "B". Za razred B ispravano bi bilo ovako:

Code:

Student    Razred     PkgType              StudNum 
---------- ------ ----------- -------------------- 
Ema        B                0                    1               
Fatima     B                0                    2               
Goca       B                1                    3               
Hamida     B                1                    4               
Ivana      B                1                    5  


Zadatak je izlistati sve studente koji imaju meispravan StudNum.

:-)
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.xdsl.xnet.co.nz.



+3 Profil

icon Re: Mozgalica Br. 1215.03.2008. u 01:12 - pre 195 meseci
Ja vidim da su ovde sotirani i po imenu. Da li je to bitno?
 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: Mozgalica Br. 1217.03.2008. u 12:57 - pre 195 meseci
U pravu si Srki, bitan je redosled po imanu. Izvinjavam se svima, ovo nije korektno:
Citat:
Treba dodeliti StudNum tako da se studenti budu sortirani po pravilu (Razred,PkgType,StudNum)

Traba da bude
[qoute]Treba dodeliti StudNum tako da se studenti budu sortirani po pravilu (Razred,PkgType,Student (ime) )[/quote]
Dakle, sortiraju se po razredu, Pkgype, ap po imenu (kolona students). Onda im se dodele redni brojevi. E, programer je malo pogresio, pa pokusavam da nadjem otkrijem redove gde je greska.
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.xdsl.xnet.co.nz.



+3 Profil

icon Re: Mozgalica Br. 1218.03.2008. u 06:44 - pre 195 meseci
Izvinjavam se, nisam proverio resenje i ovo je napamet napisano ali trebalo bi da radi:
Code:

SELECT Student, StudNum, PraviStudNum 
FROM 
     ( SELECT Student
             , StudNum
             , ROW_NUMBER() OVER(PARTITION BY Razred ORDER BY PkgType, Student) as PraviStudNum 
       FROM Studenti
     ) Pravilno_numerisanje
WHERE StudNum<>PraviStudNum;


[Ovu poruku je menjao srki dana 20.03.2008. u 06:40 GMT+1]
 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: Mozgalica Br. 1218.03.2008. u 20:37 - pre 195 meseci
Tacno! I ja sam dosao do slicnog resenja. Medjutim, proveo sam celo pre podne probajuci razne stvari, dok mi nije sinulo - pogresan redosled je onaj koji nije ispravan. Znaci, nadjem ispravan redosled i upuoredim sa stvarnim redosledom.

Moje resenje sa window funkcijama (Bog ih blagoslovio je manje elegantno nego srkijevo:
Code:

/*
Metod 1:
Naci pravi redosled, pa uporediti sa tabelom
*/
WITH IspravanRedosled AS
(
SELECT
    Student    
    , Razred     
    , PkgType     
    , StudNum = row_number() OVER (PARTITION BY Razred ORDER BY PkgType, Student)
FROM Studenti
)
SELECT 
I.*, S.StudNum AS PogresanStudNum
FROM IspravanRedosled AS I
JOIN Studenti AS S 
    ON I.Student = S.Student
WHERE S.StudNum <> I.StudNum

-- rezultat:
Student    Razred     PkgType              StudNum PogresanStudNum
---------- ------ ----------- -------------------- ---------------
Ema        B                0                    1               4
Fatima     B                0                    2               5
Goca       B                1                    3               2
Hamida     B                1                    4               3
Ivana      B                1                    5               1

(5 row(s) affected)


Uspeo sam da izmuljam i resenje koje radi u MS SQL 2000, bez window funkcija:
Code:

-- Metod 2:
-- Naci samo one redove koji nisu na pravom mestu,
SELECT
    Student    
    , Razred     
    , PkgType     
    , StudNum
    , Correct_StudNum = 1 + (SELECT COUNT(*)
            FROM Studenti AS B
            WHERE A.razred = B.razred
            AND A.PkgType >= B.PkgType
            AND A.Student > B.Student)
FROM Studenti AS A
WHERE
StudNum <> (1 + (SELECT COUNT(*)
            FROM Studenti AS B
            WHERE A.razred = B.razred
            AND A.PkgType >= B.PkgType
            AND A.Student > B.Student)
            ) 

ORDER BY
    Student    
    , Razred     
    , PkgType     
    , StudNum

-- rezultat:
Student    Razred     PkgType     StudNum Correct_StudNum
---------- ------ ----------- ----------- ---------------
Ema        B                0           4               1
Fatima     B                0           5               2
Goca       B                1           2               3
Hamida     B                1           3               4
Ivana      B                1           1               5

(5 row(s) affected)


Metod koji radi u SQL 2000 je ocigledno mnogo komplikovaniji, i da se napise i da se razume. Row_Number() cini ceo zadatak gotovo smesno jednostavnim. Jedino mi je trebalo celo pre podne da se setim da je to zaista lako ...

 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.orionhealth.com.



+3 Profil

icon Re: Mozgalica Br. 1220.03.2008. u 05:47 - pre 195 meseci
Citat:
Zidar: Metod koji radi u SQL 2000 je ocigledno mnogo komplikovaniji, i da se napise i da se razume.

A i radi sporije nego verzija sa window funkcijom. U prvom upitu gde si korisio window funkciju mozes slobodno da izbacis join sa tabelom Studenti vec samo kada pravis IspravanRedosled ubaci i trenutni StudNum u SELECT pa poredi da li je to razlicito od ispravnog StudNum. Trebalo bi da radi dosta brze.
 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: Mozgalica Br. 1220.03.2008. u 13:16 - pre 195 meseci
U pravu si u svakom pogledu. Tacno je da verzija za SQL 2000 radi sporije, mnogo je komplikovanija. A u pravu si i za pojednostavljenje verzije sa window funkcijama. Od kako sam poceo da koristim WITH, lakse mi je da pratim i razumem sta sam uradio, ali sam primetio da veoma cesto napravim suboptimalno resene sto se tice brzine. I uglavnom je krivac poneki suvisni JOIN.


 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.xdsl.xnet.co.nz.



+3 Profil

icon Re: Mozgalica Br. 1220.03.2008. u 13:40 - pre 195 meseci
Hehe, nisi jedini! I ja sam napravio suvisni JOIN pa sam posle izmenio poruku i sakrio tragove
 
Odgovor na temu

[es] :: Baze podataka :: Mozgalica Br. 12

[ Pregleda: 3310 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

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