Как получить 2 строки даты на основе идентификатора с условием? - PullRequest
0 голосов
/ 11 февраля 2020

Я хочу знать первую и вторую покупку клиентов с условием

  • первая покупка должна быть в январе, вторая покупка может быть в любое время

  • вторая покупка должна иметь другую подкатегорию (та же самая большая категория в порядке)

Это пример данных:

Table: ods.user

   ID  Category    Sub_category       Date
    1   VEH             Car           2019-01-01        -1
    1   VEH             Car           2019-01-15        (same sub cate with 1st buy)
    1   VEH             Bus           2019-02-01        (Not the smallest date)
    1   VEH             Motor         2019-01-20         -2

    2   ELT             Phone         2019-01-01        -1
    2   VEH             Car           2019-04-01        -2

    3   Fur            Table          2019-02-01       (first buy not in January)
    3   VEH            Car            2019-02-02

Это ожидаемый результат:

ID      1_cate     1_sub_cate   2_cate     2sub_cate     Days_diff
1       VEH        Car          VEH        Bus           31
2       ELT        Phone        VEH        Motor         19

P / s: в настоящее время я работаю над BigQuery из Google работает SQL язык

На данный момент это мой код:

create table #a as 
    select z.ID, z.category, z.sub_category, z.date from ods.user z
    join
        (select id, min(date) as first_buy 
         from ods.user
         having min(first_approved_time) >= '2019-01-01' and 
                min(first_approved_time) < '2019-02-01') x
    on z.id = x.id and z.date = x.min_date

create table #b as 
    select ID, category, sub_category,
        row_number() over 
        (partition by account_id, category order by first_approved_time asc) as row_num
 from ods.user
 where row_num <= 2   

Я намеревался оставить таблицу №a соединенной с таблицей #b. Однако

Таблица #b неверна, потому что она дала такой результат:

   ID  Category    Sub_category       Date               Row_num
    1   VEH             Car           2019-01-01        1
    1   VEH             Car           2019-01-15        2

Я не знаю, как ввести condition, что второе должно отличаться sub_category от первого.

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Попробуйте это:

;WITH cteUsers AS (
SELECT ID, Category, Sub_Category, Date AS PurchaseDate, row_number() OVER (PARTITION BY ID ORDER By Date) AS t
FROM [user]
WHERE ID IN (
SELECT ID 
FROM [user]
GROUP BY ID, Category, Sub_Category
HAVING MONTH(MIN(Date)) = 1
)
)
SELECT u1.ID, u1.Category AS [1_cate], u1.Sub_Category AS [2_cate], u2.Category AS [2_cate], u2.Sub_category AS [2sub_cate], DATEDIFF(d, u1.PurchaseDate, u2.PurchaseDate)
FROM cteUsers u1
INNER JOIN cteUsers u2 ON u1.ID = u2.ID AND u2.t > 1 AND u1.Sub_Category <> u2.Sub_Category
WHERE u1.t = 1
1 голос
/ 11 февраля 2020

Вы можете использовать оконные функции:

select u.*
from (select u.*,
             min(date) over (partition by id) as min_date,
             lead(sub_category) over (partition by id order by date) as next_sc
      from ods.user u
     ) u
where min_date = date and
      min_date >= date('2019-01-01') and
      min_date < date('2019-02-01') and
      sub_category <> next_sc;

Примечание: это помещает данные в одну строку, что представляется более практичным, чем разделение их на несколько строк.

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