Как найти, если n-е значение меньше, чем предыдущие значения n-1 - PullRequest
0 голосов
/ 01 мая 2018

У меня есть таблица со следующей схемой:

Order_id    customer_Id purchaseDate    movie_Id    minutesStreamed
01  C1  1/1/2000    P1  100
02  C2  1/1/2002    P2  90
03  C3  4/1/2002    P3  93
04  C4  4/1/2003    P1  99
05  C4  1/1/2006    P2  99
06  C1  5/1/2006    P5  89
07  C4  12/1/2017   P5  89
08  C3  3/3/2018    P1  145
09  C4  3/3/2018    P6  147

Я хочу найти тех клиентов, которые смотрят все меньше и меньше минут каждый раз, когда смотрят фильм, т. Е. Их второй поток меньше 1-го, а их 3-й меньше их 2-го и т. Д. И т. Д.

Я знаю, как найти один случай, т. Е. 3-й <2-й или 2-й <1-й, но как проверить все комбинации. </p>

select a.*
from
(
select customer_id,purchase_date,minutes_streamed, lag(minutes_streamed,1) over (partition by customer_id order by purchase_date) prev_mins_streams
from orders
)a
inner join
(select customer_id,max(purchase_date) max_purchase_dt from orders group by customer_id) b
on a.customer_id=b.customer_id
and a.purchase_date=b.max_purchase_dt
where a.minutes_streamed<a.prev_mins_streams
;

1 Ответ

0 голосов
/ 01 мая 2018

Если вам нужны клиенты, которые только отклоняются, задайте флаг, а затем агрегируйте квартиру:

select o.customer_id
from (select o.*,
             lag(minutes_streamed,1) over (partition by customer_id order by purchase_date) as prev_ms
      from orders o
     ) o
group by o.customer_id
having sum(case when prev_ms is null or prev_ms < minutes_streams then 0 else 1 end) = 0; 

Предложение having в основном учитывает исключения. = 0 говорит, что их нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...