jeli ovo moguće u firebirdu?
select top x iz svake grupe
Zaključano
Zakačeno
Ne verujem da može upitom. I meni je to trebalo, rešio sam preko SP. Nešto sporije, ali radi.
jel možeš staviti tu rješenje?
prepostavljam da ide s cursorom.
prepostavljam da ide s cursorom.
Velika je procedura, ne mogu da je pošaljem celu. Osnova je ovo:
Code:
create procedure PROC()
returns (
RX INTEGER,
RY INTEGER,
RZ INTEGER)
as
declare variable LX INTEGER;
declare variable LY INTEGER;
declare variable LZ INTEGER;
declare variable LCOUNTER INTEGER;
BEGIN
// neke pocetne vrednosti
LX = -1;
LY = -1;
LZ = -1;
LCOUNTER = 0;
FOR SELECT X, Y, Z
FROM TABLE
ORDER BY 1, 2, 3
INTO :RX, :RY, :RZ
DO
BEGIN
// ovako detektujem promenu grupe
IF ((RX <> LX) OR (RY <> LY)) THEN
BEGIN
LCOUNTER = 0;
END
// uzimam po 5 iz svake grupe
IF (LCOUNTER < 5) THEN
BEGIN
LCOUNTER = LCOUNTER + 1;
SUSPEND;
END
// Ovo je potrebno za detekciju promene grupe
LX = :RX;
LY = :RY;
END
END
create procedure PROC()
returns (
RX INTEGER,
RY INTEGER,
RZ INTEGER)
as
declare variable LX INTEGER;
declare variable LY INTEGER;
declare variable LZ INTEGER;
declare variable LCOUNTER INTEGER;
BEGIN
// neke pocetne vrednosti
LX = -1;
LY = -1;
LZ = -1;
LCOUNTER = 0;
FOR SELECT X, Y, Z
FROM TABLE
ORDER BY 1, 2, 3
INTO :RX, :RY, :RZ
DO
BEGIN
// ovako detektujem promenu grupe
IF ((RX <> LX) OR (RY <> LY)) THEN
BEGIN
LCOUNTER = 0;
END
// uzimam po 5 iz svake grupe
IF (LCOUNTER < 5) THEN
BEGIN
LCOUNTER = LCOUNTER + 1;
SUSPEND;
END
// Ovo je potrebno za detekciju promene grupe
LX = :RX;
LY = :RY;
END
END
Ako misliš first, može:
select first 10 tablica.field from tablica
select first 10 tablica.field from tablica
Citat:
sorry, ali ne radi se o ovome.
nego o query-u koji vraća top x iz svake grupe.
recimo:
imamo tablice: sport, natjecatelj, rezultati(ovo je vezna).
potrebno je prikazati podatke za topp 4 najbolja atletičara za svaki sport.
našao sam i jedan drugi način.
ovo je samo primjer
SELECT id,A
FROM new_table
WHERE (
SELECT COUNT(*) FROM new_table f
WHERE f.id = NEW_TABLE.id AND f.a<new_table.a
) <= 1;
kad se stavi 0, vraća top 1 iz svake grupe, kad se stavi jedan vraća top 2 itd...
Mozda ovako nesto:
WITH PRIPREMA AS (
SELECT N.ID, S.ID, SUM(RESULTATI) RESULT
FROM NATJECATELJI N
INNER JOIN REZULTATI R ON (...)
INNER JOIN SPORT S ON (...)
GROUP BY 1,2
)
SELECT FIRST 4 N.*
FROM PRIPREMA P
INNER JOIN NATJECACELJI N ON (...)
WHERE ...
ORDER BY P.RESULT DESC
Za detalje pogledajte README.common_table_expressions.txt u doc folderu od FB 2.5
WITH PRIPREMA AS (
SELECT N.ID, S.ID, SUM(RESULTATI) RESULT
FROM NATJECATELJI N
INNER JOIN REZULTATI R ON (...)
INNER JOIN SPORT S ON (...)
GROUP BY 1,2
)
SELECT FIRST 4 N.*
FROM PRIPREMA P
INNER JOIN NATJECACELJI N ON (...)
WHERE ...
ORDER BY P.RESULT DESC
Za detalje pogledajte README.common_table_expressions.txt u doc folderu od FB 2.5
ovaj query što sam stavio radi ok.