Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

January 25, 2008 / by Zsolt Soczó

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.

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

LEAVE A COMMENT

4 COMMENTS

  • kaz January 25, 2008

    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

  • Soczó Zsolt January 25, 2008

    Kaz: ügyes, tényleg, kezdek szégyenkezni a saját megoldásommal. :)

  • kpocza January 26, 2008

    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.

  • kpocza January 26, 2008

    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.