#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 по пользователю
должно сработать.