alamb commented on issue #15714:
URL: https://github.com/apache/datafusion/issues/15714#issuecomment-5151056351

   I updated the title of this ticket to describe the gap in feature (rather 
than this is a bug)
   
   I think the core limitation today in DataFusion is that the window size must 
be a constant (either rows or expression). Window sizes that are expressions 
themselves are not supported. 
   
   As an example of what is supported today in DataFusion (54) 
   
   ```sql
   >  SELECT
       id, ts, val,
       -- ROWS: fixed count of physical rows (1 preceding + current)
       SUM(val) OVER (
         ORDER BY ts, id
         ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
       ) AS rows_frame,
       -- RANGE: value-based offset on the ORDER BY column (1 day window)
       SUM(val) OVER (
         ORDER BY ts
         RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND CURRENT ROW
       ) AS range_frame,
       -- GROUPS: counts distinct peer groups (tied ORDER BY values) as one unit
       SUM(val) OVER (
         ORDER BY ts
         GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
       ) AS groups_frame
     FROM t
     ORDER BY ts, id;
   +----+---------------------+-----+------------+-------------+--------------+
   | id | ts                  | val | rows_frame | range_frame | groups_frame |
   +----+---------------------+-----+------------+-------------+--------------+
   | 1  | 2024-01-01T00:00:00 | 10  | 10         | 30          | 30           |
   | 2  | 2024-01-01T00:00:00 | 20  | 30         | 30          | 30           |
   | 3  | 2024-01-02T00:00:00 | 30  | 50         | 60          | 60           |
   | 4  | 2024-01-04T00:00:00 | 40  | 70         | 40          | 70           |
   | 5  | 2024-01-05T00:00:00 | 50  | 90         | 90          | 90           |
   +----+---------------------+-----+------------+-------------+--------------+
   5 row(s) fetched.
   Elapsed 0.002 seconds.
   ```
   
   
   Here are examples of queries with arbitrary expressions  that don't work
   
   ```sql
   >   -- FAILS: bound is an *expression* (spec's `expr PRECEDING`), issue 
#15714
     SELECT val, SUM(val) OVER (
         ORDER BY ts
         RANGE BETWEEN (INTERVAL '1' DAY + INTERVAL '1' DAY) PRECEDING AND 
CURRENT ROW
       ) FROM t;
   
   Error during planning: Invalid window frame: frame offsets for RANGE must be 
either a numeric value, a string value or an interval
   ```
   
   ```sql
   >   -- FAILS: same problem for ROWS with an integer expression
     SELECT val, SUM(val) OVER (
         ORDER BY ts
         ROWS BETWEEN (1 + 1) PRECEDING AND CURRENT ROW
       ) FROM t;
   Error during planning: Invalid window frame: frame offsets for ROWS / GROUPS 
must be non negative integers
   ```
   
   
   <details><summary>SQL Source</summary>
   <p>
   
   ```sql
    CREATE TABLE t (id INT, ts TIMESTAMP, val INT) AS VALUES
       (1, TIMESTAMP '2024-01-01 00:00:00', 10),
       (2, TIMESTAMP '2024-01-01 00:00:00', 20),  -- same ts as row 1 -> tied 
peer group
       (3, TIMESTAMP '2024-01-02 00:00:00', 30),
       (4, TIMESTAMP '2024-01-04 00:00:00', 40),  -- gap of 2 days from previous
       (5, TIMESTAMP '2024-01-05 00:00:00', 50);
   
     SELECT
       id, ts, val,
       -- ROWS: fixed count of physical rows (1 preceding + current)
       SUM(val) OVER (
         ORDER BY ts, id
         ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
       ) AS rows_frame,
       -- RANGE: value-based offset on the ORDER BY column (1 day window)
       SUM(val) OVER (
         ORDER BY ts
         RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND CURRENT ROW
       ) AS range_frame,
       -- GROUPS: counts distinct peer groups (tied ORDER BY values) as one unit
       SUM(val) OVER (
         ORDER BY ts
         GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
       ) AS groups_frame
     FROM t
     ORDER BY ts, id;
   ```
   
   This is the smae as DuckDB
   
   ```sql
   
   memory D  CREATE TABLE t AS
              SELECT * FROM (VALUES
                  (1, TIMESTAMP '2024-01-01 00:00:00', 10),
                  (2, TIMESTAMP '2024-01-01 00:00:00', 20),  -- same ts as row 
1 -> tied peer group
                  (3, TIMESTAMP '2024-01-02 00:00:00', 30),
                  (4, TIMESTAMP '2024-01-04 00:00:00', 40),  -- gap of 2 days 
from previous
                  (5, TIMESTAMP '2024-01-05 00:00:00', 50)
              ) AS t(id, ts, val);
   
   memory D SELECT
                id, ts, val,
                -- ROWS: fixed count of physical rows (1 preceding + current)
                SUM(val) OVER (
                  ORDER BY ts, id
                  ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
                ) AS rows_frame,
                -- RANGE: value-based offset on the ORDER BY column (1 day 
window)
                SUM(val) OVER (
                  ORDER BY ts
                  RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND CURRENT ROW
                ) AS range_frame,
                -- GROUPS: counts distinct peer groups (tied ORDER BY values) 
as one unit
                SUM(val) OVER (
                  ORDER BY ts
                  GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
                ) AS groups_frame
              FROM t
              ORDER BY ts, id;
   
┌───────┬─────────────────────┬───────┬────────────┬─────────────┬──────────────┐
   │  id   │         ts          │  val  │ rows_frame │ range_frame │ 
groups_frame │
   │ int32 │      timestamp      │ int32 │   int128   │   int128    │    int128 
   │
   
├───────┼─────────────────────┼───────┼────────────┼─────────────┼──────────────┤
   │     1 │ 2024-01-01 00:00:00 │    10 │         10 │          30 │           
30 │
   │     2 │ 2024-01-01 00:00:00 │    20 │         30 │          30 │           
30 │
   │     3 │ 2024-01-02 00:00:00 │    30 │         50 │          60 │           
60 │
   │     4 │ 2024-01-04 00:00:00 │    40 │         70 │          40 │           
70 │
   │     5 │ 2024-01-05 00:00:00 │    50 │         90 │          90 │           
90 │
   
└───────┴─────────────────────┴───────┴────────────┴─────────────┴──────────────┘
   ```
   
   </p>
   </details> 


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to