Hirdetés

Új hozzászólás Aktív témák

  • nyunyu
    félisten

    Mármint sokkal egyszerűbb, mint ügyfelenként meghatározni az utolsó előfizetési dátumot, és az ahhoz tartozó rekordot visszakeresni az előfizetés táblában, hogy utána joinolhassam az előfizetőhöz:

    select u.*, s.status
    from users u
    left join (
    select *
    from subscription
    where (customer_id, createdate) in (
    select customer_id, max(createdate)
    from subscription
    group by customer_id) s
    on s.customer_id = u.customer_id;

    (Tényleg, Oraclen kívül van más olyan DB is, ami támogatja a sokoszlopos IN / NOT IN műveleteket?
    Ha jól rémlik, ez a szintaxis nincs szabványosítva)

    Valószínűleg ablakozós max() függvénnyel is lehetne írni, és akkor nem kellene a group by köré írt külső query:
    select u.*, s.status
    from users u
    left join (
    select *
    from subscription
    where createdate = max(createdate) over (partition by customer_id)
    ) s
    on s.customer_id = u.customer_id;

    Talán így a legrövidebb a kód.

    Szerkesztési idő lejárt. :(

    Ha az ügyfélnek két azonos időbélyegű előfizetése van, akkor a row_number() -es megoldás véletlenszerűen vagy az egyiket vagy a másik státuszát fogja visszaadni, így csak 1 sor fog hozzá tartozni.
    Míg a másik két opció mindkét legfrissebb előfizetés státuszát visszaadja, azokkal egy ügyfélhez 2 sort fogsz kapni.

    (Ha a row_number()-t rank()-ra cseréled, akkor az is mindkettőt vissza fogja adni.)

Új hozzászólás Aktív témák