Заявление GroupBy, чтобы увидеть последнее состояние подписки - PullRequest
0 голосов
/ 21 февраля 2020

У меня небольшие проблемы с созданием оператора SQL, который покажет этим пользователям последнее состояние подписки. Вот примеры данных

subscription_id: abc
user_id: 123
product: ESPN
from_state: trial
to_state: new
transition_time: 2020-01-01:00:00:00:000

subscription_id: abc
user_id: 123
product: ESPN
from_state: new
to_state: canceled
transition_time: 2020-01-01:00:00:00:002

subscription_id: abc
user_id: 123
product: DISNEY
from_state: trial
to_state: new
transition_time: 2020-01-01:00:00:00:000

subscription_id: ab4
user_id: 123
product: ESPN
from_state: inactive
to_state: trial
transition_time: 2020-01-01:00:00:00:006

subscription_id: ab23
user_id: 126
product: ESPN
from_state: trial
to_state: new
transition_time: 2020-01-01:00:00:00:009

subscription_id - это поле, которое представляет выбранный вами продукт и тип плана (например, espn с подпиской на 1 неделю). User_id - уникальное поле для каждого пользователя. Продукт - это продукт, на который вы бы подписались (например, Espn). From_state, to_state - это переходы, сделанные этим пользователем (например, пробная версия на новую). И перехода_времени - это время, когда это было сделано.

. Учитывая это, я хотел бы создать запрос, который показывает только user_id, product и to_state для состояния LATEST для моих продуктов и пользователей. Этот запрос должен вернуть эти четыре строки, если выполняется в приведенном выше примере:

user_id: 123
product: ESPN
to_state: canceled


user_id: 123
product: DISNEY
to_state: new


user_id: 123
product: ESPN
to_state: trial


user_id: 126
product: ESPN
to_state: new

Спасибо

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Использование row_number():

select t.*
from (select t.*,
             row_number() over (partition by user_id order by transition_time desc) as seqnum
      from t
     ) t
where seqnum = 1;
0 голосов
/ 21 февраля 2020

Предположим, ваша таблица называется source_data, вы можете попробовать это:

SELECT x.product, x.user_id, x.to_state
FROM   source_data AS x
WHERE  NOT EXISTS (
         SELECT *
         FROM   source_data AS y
         WHERE  y.user_id = x.user_id
         AND    y.product = x.product
         AND    y.transition_time > x.transition_time
       )
;

Это должно работать в любой базе данных, совместимой с ANSI- SQL.


В основном это занимает Ваша таблица данных дважды (каждый экземпляр с именем x и y, соответственно), затем соединяет их вместе с помощью составного ключа {user_id, product} и сохраняет только те строки, где x имеет самый высокий transition_time.

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