I MS SQl konja za trku ima (Row_Number :-)
Prvo sam napravio ovo, po ugledu na CandyMan i Chacku:
Code:
SELECT
Gender
, Topic
, GuestName
, OrderNumber = Row_number() OVER (PARTITION BY gender, topic ORDER BY gender, topic )
FROM Guests
i dobio ovo:
Code:
Gender Topic GuestName OrderNumber
F Istorija Cica 1
F Istorija Jaca 2
F Istorija Juca 3
F Istorija Maca 4
F Istorija Melanija 5
F Muzika Mica 1
F Muzika Jeca 2
F Muzika Veca 3
F Muzika Zoca 4
Onda sam uvideo da vazi sledece:
ako je OrderNumber [paran, onda je [broj sobe] = OrderNumber /2
ako je oredr number neparan, onda je [broj sobe] = (Ordernumber+1)/2
sto se da lako proveriti. Parnost se lako proveri celobrojnim deljenjem, kao
IF INT(x/2) = X THEN X je paran ELSE x je neparan
sto se u MS SQL moze uraditi pomocu CASE izraza.
medjutim, napravio sam neke greske u kucanju i ipak dobio tacan rezultat na sledeci nacin:
Code:
SELECT
Gender
, Topic
, GuestName
, RoomNumber = (1+Row_number() OVER (PARTITION BY gender, topic ORDER BY gender, topic ))/2
FROM Guests
Code:
Gender Topic GuestName RoomNumber
F Istorija Cica 1
F Istorija Jaca 1
F Istorija Juca 2
F Istorija Maca 2
F Istorija Melanija 3
F Muzika Mica 1
F Muzika Jeca 1
F Muzika Veca 2
F Muzika Zoca 2
Znaci, nisat CASE nista celobrojno deljenje, samo dodas 1 na Row_number i to podelis sa dva => dobijes Room_Number.
Ne pitajte me zasto je ovo ovako i u cemu je stos, ne znam. Ako neko zna da objasni ovo, molim da se javi.
Onda sam hteo da budem pametan i da bas sve resim u jednom kveriju, pa sam pokusao ovo:
Code:
SELECT
Gender
, Topic
, Guest_1 = MIN(GuestName)
, Guset_2 = MAX(GuestName)
, RoomNumber = (1+Row_number() OVER (PARTITION BY gender, topic ORDER BY gender, topic ))/2
FROM Guests
GROUP BY
Gender
, Topic
, (1+Row_number() OVER (PARTITION BY gender, topic ORDER BY gender, topic ))/2
idobio ovo:
Citat:
Msg 4108, Level 15, State 1, Line 1
Windowed functions can only appear in the SELECT or ORDER BY clauses.
Naravno da je ovo proradilo:
Code:
SELECT
Gender
,Topic
, RoomNumber
, Guest_1 = MIN(GuestName)
, Guest_2 = MAX(GuestName)
FROM
(
SELECT
Gender
, Topic
, GuestName
, RoomNumber = (1+Row_number() OVER (PARTITION BY gender, topic ORDER BY gender, topic ))/2
FROM Guests
) AS X
GROUP BY
Gender
,Topic
, RoomNumber
Ali, pogledajte rezultate:
Code:
Gender Topic RoomNumber Guest_1 Guest_2
F Istorija 1 Cica Jaca
F Istorija 2 Juca Maca
F Istorija 3 Melanija Melanija
F Muzika 1 Jeca Mica
F Muzika 2 Veca Zoca
M Istorija 1 Pera Zoran
M Istorija 2 Krle MIka
M Istorija 3 Laza Laza
M Muzika 1 Janko Ludwig
M Muzika 2 Djura Goran
M Muzika 3 Milan Zika
Melanija u sobi sa Melanijom i Laza u sobi sam sa sobom, U sustini tacno, ali zelimo da pokazemo da je drugi krevet slobodan.
Upotrebio sam NULIIF funkciju:
Code:
SELECT
Gender
,Topic
, RoomNumber
, Guest_1 = MIN(GuestName)
, Guest_2 = NULLIF(MAX(GuestName),MIN(GuestName))
FROM
(
SELECT
Gender
, Topic
, GuestName
, RoomNumber = (1+Row_number() OVER (PARTITION BY gender, topic ORDER BY gender, topic ))/2
FROM Guests
) AS X
GROUP BY
Gender
,Topic
, RoomNumber
i rezultat:
Code:
Gender Topic RoomNumber Guest_1 Guest_2
F Istorija 1 Cica Jaca
F Istorija 2 Juca Maca
F Istorija 3 Melanija NULL
F Muzika 1 Jeca Mica
F Muzika 2 Veca Zoca
M Istorija 1 Pera Zoran
M Istorija 2 Krle MIka
M Istorija 3 Laza NULL
M Muzika 1 Janko Ludwig
M Muzika 2 Djura Goran
M Muzika 3 Milan Zika
Pazljivo sa NULLIF funkcijom. Zamenite redosled argumanata u NULLIF i vidite sta cete dobiti :-)
Svaka cast CandyMan i Chachka za ideju sa Row_Count. Ko u sistemu nema row_count, ima chachkino resenje sa subkverijima