Filtering by window function result in Postgresql

后端 未结 2 1291
心在旅途
心在旅途 2021-02-07 01:34

Ok, initially this was just a joke we had with a friend of mine, but it turned into interesting technical question :)

I have the following stuff table:

相关标签:
2条回答
  • I don't know if this qualifies as "more elegant" but it is written in a different manner than Cybernate's solution (although it is essentially the same)

    WITH window_table AS 
    ( 
       SELECT s.*, 
              sum(volume) OVER previous_rows as total
       FROM stuff s
       WINDOW previous_rows as 
            (ORDER BY priority desc ROWS between UNBOUNDED PRECEDING and CURRENT ROW)
    ) 
    SELECT * 
    FROM window_table
    WHERE total < 1000
    ORDER BY priority DESC 
    

    If by "more elegant" you mean something that avoids the sub-select, then the answer is "no"

    0 讨论(0)
  • 2021-02-07 02:17

    I haven't worked with PostgreSQL. However, my best guess would be using an inline view.

    SELECT a.*
    FROM (
        SELECT s.*, sum(volume) OVER previous_rows AS total
        FROM stuff AS s
        WINDOW previous_rows AS (
             ORDER BY priority desc
             ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        )
        ORDER BY priority DESC
    ) AS a
    WHERE a.total < 1000;
    
    0 讨论(0)
提交回复
热议问题