0

I have a huge sql table (more than 1 billion) of user transactions.
I'd like to add a binary column which represents where or not the current user_id row is 40 minutes or less than the previous one.

For instance:

user_id | date                
--------+--------------------
1       | 2011-01-01 12:15:00
1       | 2011-01-01 12:00:00
8       | 2011-01-01 15:00:00
8       | 2011-01-01 14:00:00

the result of the query would be:

user_id | date                | new
--------+---------------------+----
1       | 2011-01-01 12:15:00 | 0
1       | 2011-01-01 12:00:00 | 1
8       | 2011-01-01 15:00:00 | 1
8       | 2011-01-01 14:00:00 | 1

I'd like to avoid joining the entire table to itself and maybe use a side table or an analytic function (over-partition).

4

1 に答える 1

3
select user_id,
       date,
       case
          when date - lag(date) over (partition by user_id order by date) > interval '40' minute then 1
          else 0
       end as diff_flag
from the_table
order by user_id, date

dateその名前にもかかわらず、それはタイムスタンプ列であると想定しています。

それは私が見ることができる唯一の方法です。(user_id, date) のインデックスは処理を高速化する可能性があります。特に 9.2 では、これがインデックスのみのスキャンに適している可能性があります。しかし、これテーブル全体をスキャンします (または 9.2 のインデックスのみかもしれません)。

ところで: 予約語 ( date) を使用して列に名前を付けることはお勧めできません。さらにdate、ドキュメントの観点からは非常に貧弱な名前です。

于 2012-11-25T19:46:19.223 に答える