Как определить, когда пользователь впервые подписался на продукт?

#sql

#sql

Вопрос:

Предоставьте SQL-запрос (любой движок) для вычисления первого раза, когда пользователь подписался на продукт.

Таблица: подписчики

 Month     Year  User
January   2016  ZandraDilnot
January   2016  AlfonseMeans
January   2017  KandyChiandotto
February  2017  AlfonseMeans
February  2017  SusanRowan
March     2017  AlfonseMeans
March     2017  ZandraDilnot
March     2017  CrystalPoindexter
  

Я попробовал использовать Where и group by combo, чтобы придумать логику, но не могу найти правильный запрос к so!

выберите месяц, год, пользователя из подписчиков, где (необходимо проверить минимальный год) группируется по пользователю

Ожидаемый результат

 Month     Year  User
January   2016  ZandraDilnot
January   2016  AlfonseMeans
January   2017  KandyChiandotto
February  2017  SusanRowan
March     2017  CrystalPoindexter
... ... ...
  

Комментарии:

1. Является ли столбец Month текстовым — January , February , …?

2. Это не относится к какой-либо базе данных, вы можете рассматривать раздел месяц как тип данных Datetime.

Ответ №1:

Это может сработать:

 SELECT User, MIN(Year),MIN(Month) FROM subscribers GROUP BY User
  

Ответ №2:

вот как это сделать с CTE… нет … Я добавил дополнительный столбец с месяцем в виде числа, чтобы упростить сортировку без необходимости преобразования его в строку.

 create table #Test (m1 varchar(100) , m2 smallint ,  y int, u varchar(100));
insert into #Test (m1 , m2 , y , u) values ('January  ',1,2016,'ZandraDilnot      '       )
insert into #Test (m1 , m2 , y , u) values ('January  ',1,2016,'AlfonseMeans      '       )
insert into #Test (m1 , m2 , y , u) values ('January  ',1,2017,'KandyChiandotto   '   )
insert into #Test (m1 , m2 , y , u) values ('February ',2,2017,'AlfonseMeans      '       )
insert into #Test (m1 , m2 , y , u) values ('February ',2,2017,'SusanRowan        '   )
insert into #Test (m1 , m2 , y , u) values ('March    ',3,2017,'AlfonseMeans      '       )
insert into #Test (m1 , m2 , y , u) values ('March    ',3,2017,'ZandraDilnot      '       )
insert into #Test (m1 , m2 , y , u) values ('March    ',3,2017,'CrystalPoindexter '   )

;

with cte1 AS 
(
select * 
    ,  RANK() OVER (PARTITION BY u ORDER BY m2 , y ) AS R
From #test
)
select * 
From cte1 where R = 1;
  

Ответ №3:

Один из вариантов — объединить первые два столбца и создать поле даты. Затем следующий запрос:

выберите пользователя, мин (дата) из группы tbl по пользователю

должно сработать.