Расчет номеров недель по произвольным датам - PullRequest
2 голосов
/ 04 июня 2019

У меня есть идентификаторы клиентов и даты их входа в систему. я хочу рассчитать номер недели по дате первого входа в систему

Я довольно новичок в SQL

Демонстрационный выход

ClientID          Date of login         Week Number
1                 2019-12-20                1
1                 2019-12-21                1
1                 2019-12-21                1 
1                 2019-12-22                1 
1                 2019-12-29                2 
1                 2019-12-29                2
2                 2020-01-27                1 
2                 2020-01-28                1 
2                 2020-02-05                2
2                 2020-02-06                2
2                 2020-02-16                3 

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Это очень тривиальная арифметика дат, для которой просто требуется min DateOfLogin для каждого ClientID, который вы можете найти с помощью оконной функции.

Рассчитайте datediff в днях между этой датойи текущее DateOfLogin, целочисленное деление на 7 (чтобы вернуть не дробные дни), а затем добавьте 1 для правильного смещения значения WeekNum:

declare @l table(ClientID int, DateOfLogin date);
insert into @l values(1,'2019-12-20'),(1,'2019-12-21'),(1,'2019-12-21'),(1,'2019-12-22'),(1,'2019-12-29'),(1,'2019-12-29'),(2,'2020-01-27'),(2,'2020-01-28'),(2,'2020-02-05'),(2,'2020-02-06'),(2,'2020-02-16');

select ClientID
        ,DateOfLogin
        ,(datediff(day,min(DateOfLogin) over (partition by ClientID),DateOfLogin) / 7) + 1 as WeekNum
from @l;

Выход

+----------+-------------+---------+
| ClientID | DateOfLogin | WeekNum |
+----------+-------------+---------+
|        1 | 2019-12-20  |       1 |
|        1 | 2019-12-21  |       1 |
|        1 | 2019-12-21  |       1 |
|        1 | 2019-12-22  |       1 |
|        1 | 2019-12-29  |       2 |
|        1 | 2019-12-29  |       2 |
|        2 | 2020-01-27  |       1 |
|        2 | 2020-01-28  |       1 |
|        2 | 2020-02-05  |       2 |
|        2 | 2020-02-06  |       2 |
|        2 | 2020-02-16  |       3 |
+----------+-------------+---------+
0 голосов
/ 04 июня 2019

Этот запрос возвращает номер недели.

select DATENAME(WW, '2019-12-20')

Это для MSSQL.

Здесь может быть решение для вас, возможно, вам просто нужно посмотреть, как вы собираетесь делать вставку, и, возможно, оптимизировать ее немного лучше.

select 1 AS 'ClientID', '2019-12-20' AS 'LogInDate', 1 AS 'Week' into #test

enter image description here

insert into #test select top(1) 1, '2020-02-05', case DATEDIFF(week,'2020-02-05',LogInDate) when 0 then week else Week +1 end from #test where ClientID = 1 order by LogInDate desc

enter image description here

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