sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres UPDATE ved hjælp af rangeringsvinduefunktion

Da du ikke har en unik nøgle, skal du bruge ctid :

update medias m
    set sort_order = new_sort_order
    from (
        select 
            ctid,
            owner_user_id, 
            sort_order, 
            row_number() over w as new_sort_order 
        from medias 
        where visible
        window w as (partition by owner_user_id order by sort_order asc, created_at asc)
    ) s
    where m.ctid = s.ctid;

Bemærk, row_number() kan være bedre end rank() da den første aldrig giver dubletter.



  1. For store POST-data. Reducer dataene eller øg post_max_size

  2. PostgreSQL-forespørgsel -- kolonne eksisterer ikke

  3. Hvordan genererer man en dynamisk sekvenstabel i MySQL?

  4. Alternativ af sys_refcursor