SQL fejtörő
A feladvány itt van.
Tegnap éjjel fájt Benedek hasa, sétálgattam kicsit vele, közben kitaláltam rá egy megoldást, és még jó is az eredménye. :)
Pár nap múlva kirakom a sajátomat, addig is jöhet a tiétek.
A feladvány itt van.
Tegnap éjjel fájt Benedek hasa, sétálgattam kicsit vele, közben kitaláltam rá egy megoldást, és még jó is az eredménye. :)
Pár nap múlva kirakom a sajátomat, addig is jöhet a tiétek.
January 25th, 2008 at 4:20 pm
with q(v, vid)
as
(
select amt, vid
from Vouchers v1
union all
select
v+amt, v1.vid
from q, Vouchers v1
where
q.vid<v1.vid
)
select distinct v from q order by 1
January 25th, 2008 at 4:28 pm
Kaz: ügyes, tényleg, kezdek szégyenkezni a saját megoldásommal. :)
January 26th, 2008 at 11:55 am
SELECT DISTINCT
SUM(v.amt) as amt
FROM
(
SELECT
nt.number
FROM
(
SELECT
row_number() OVER (ORDER BY s1.name) as number
FROM
sysobjects s1
CROSS JOIN sysobjects s2) nt
WHERE nt.number 0)
GROUP BY n.number
Magyarul egy szám bitindexeinek tekintem a vid értékeket, és ezeket minden kominációban ki-be kapcsolgatom, amit úgy érek el, hogy egész számogat generálok, és a bitekre nézem, hogy melyik mikor van bekapcsolva a különböző egész számok bináris ábrázolása esetében. Minden esetben a bekapcsolt bitekhez tartozó értékeket kell összeadni.
Mit mondjak, eléggé gáz módon lehet egész számokat generálni. A CTE és a rekurzív CTE-s megoldás szintés fos.
Kaz megoldása sztem ötletesebb.
January 26th, 2008 at 11:58 am
SELECT DISTINCT
SUM(v.amt) as amt
FROM
(
SELECT
nt.number
FROM
(
SELECT
row_number() OVER (ORDER BY s1.name) as number
FROM
sysobjects s1
CROSS JOIN sysobjects s2) nt
WHERE nt.number < power(2, (select max(vid)+1 from Vouchers))
) n
INNER JOIN Vouchers v on (n.number & convert(int, (power(2, v.vid))) > 0)
GROUP BY n.number
Na pár html karaktert megevett az előző komment. Próbálom másképp küldeni.