Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I put a condition on a window function in Redshift?

I have an events-based table in Redshift. I want to tie all events to the FIRST event in the series, provided that event was in the N-hours preceding this event.

If all I cared about was the very first row, I'd simply do:

SELECT
   event_time
   ,first_value(event_time) 
      OVER (ORDER BY event_time rows unbounded preceding) as first_time
FROM
   my_table

But because I only want to tie this to the first event in the past N-hours, I want something like:

SELECT
   event_time
   ,first_value(event_time) 
       OVER (ORDER BY event_time rows between [N-hours ago] and current row) as first_time
FROM
   my_table

A little background on my table. It's user actions, so effectively a user jumps on, performs 1-100 actions, and then leaves. Most users are 1-10x per day. Sessions rarely last over an hour, so I could set N=1.

If I just set a PARTITION BY date_trunc('hour', event_time), I'll double create for sessions that span the hour.

Assume my_table looks like

id | user_id | event_time
----------------------------------
 1 |   123   | 2015-01-01 01:00:00
 2 |   123   | 2015-01-01 01:15:00
 3 |   123   | 2015-01-01 02:05:00
 4 |   123   | 2015-01-01 13:10:00
 5 |   123   | 2015-01-01 13:20:00
 6 |   123   | 2015-01-01 13:30:00

My goal is to get a result that looks like

id | parent_id | user_id | event_time
----------------------------------
 1 |   1       |  123    | 2015-01-01 01:00:00
 2 |   1       |  123    | 2015-01-01 01:15:00
 3 |   1       |  123    | 2015-01-01 02:05:00
 4 |   4       |  123    | 2015-01-01 13:10:00
 5 |   4       |  123    | 2015-01-01 13:20:00
 6 |   4       |  123    | 2015-01-01 13:30:00
like image 365
ScottieB Avatar asked Sep 23 '15 22:09

ScottieB


People also ask

Does Redshift support window functions?

Amazon Redshift supports two types of window functions: aggregate and ranking. These are the supported aggregate functions: AVG. COUNT.

Can we use Max in window function?

The MAX() window function returns the maximum value of the expression across all input values. The MAX function works with numeric values and ignores NULL values.

How do you write an if statement in Redshift?

Redshift IF-THEN-ELSE statements You can write the statements to run in the ELSE part. For example: IF v_id IS NOT NULL THEN UPDATE patient_dim SET mobile = v_mobile where id = v_id; return 1; ELSE return 0; END IF; Here is the Redshift stored procedure example to demonstrate IF-THEN-ELSE condition statement.

Can you use count in window function?

The COUNT window function counts the rows defined by the expression. The COUNT function has two variations. COUNT(*) counts all the rows in the target table whether they include nulls or not. COUNT(expression) computes the number of rows with non-NULL values in a specific column or expression.


1 Answers

The answer appears to be "no" as of now.

There is a functionality in SQL Server of using RANGE instead of ROWS in the frame. This allows the query to compare values to the current row's value.

https://www.simple-talk.com/sql/learn-sql-server/window-functions-in-sql-server-part-2-the-frame/

When I attempt this syntax in Redshift I get the error that "Range is not yet supported"

Someone update this when that "yet" changes!

like image 76
ScottieB Avatar answered Oct 27 '22 21:10

ScottieB