Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Соединить таблицу саму с собой / 7 сообщений из 7, страница 1 из 1
13.09.2018, 17:19
    #39702269
myrzilka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицу саму с собой
Помогите, пожалуйста, никак не могу склеить таблицу.

Есть id_пользователя, событие, дата.

Надо получить выборку такого вида - id_пользователя, дата_начала (события), дата_окончания (события).

Пробовала row_number as n1/n2 ставить на поле с датой, но в join ругается на оператор "-" n1=n2-1

Подскажите, пожалуйста.
Мне потом эти даты еще вычитать между собой надо.
...
Рейтинг: 0 / 0
13.09.2018, 17:43
    #39702283
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицу саму с собой
myrzilkaНадо получить выборку такого вида - id_пользователя, дата_начала (события), дата_окончания (события).
Это вам нужно? Если нет, то подробней задачу опишите, желательно с тестовыми данными и необходимым результатом.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with cteData (UserId, Event, Date)
as (
              select 1, 1, cast('20180101' as date)
    union all select 1, 2, cast('20180102' as date)
    union all select 1, 2, cast('20180103' as date)
    union all select 1, 1, cast('20180104' as date)
    union all select 2, 1, cast('20180105' as date)
    union all select 2, 1, cast('20180106' as date)
)
select d.UserId
     , d.Event
     , min(d.Date) as MinDate
     , max(d.Date) as MaxDate
from cteData d
group by d.UserId, d.Event
order by d.UserId, d.Event


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
UserId      Event       MinDate    MaxDate
----------- ----------- ---------- ----------
1           1           2018-01-01 2018-01-04
1           2           2018-01-02 2018-01-03
2           1           2018-01-05 2018-01-06

(3 rows affected)
...
Рейтинг: 0 / 0
13.09.2018, 17:58
    #39702291
myrzilka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицу саму с собой
надо получить не минимум и максимум, а последовательные даты. Что-то вроде этого
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
id_пользователя	дата_начала	дата_окончания
2	         01.03.2017 5:38	
2	        01.03.2017 5:39	01.03.2017 5:38
2	        01.03.2017 5:39	01.03.2017 5:39
2	        01.03.2017 5:39	01.03.2017 5:39
2	        01.03.2017 5:39	01.03.2017 5:39
2	        01.03.2017 5:41	01.03.2017 5:39
2	        01.03.2017 5:41	01.03.2017 5:41
2	        01.03.2017 5:42	01.03.2017 5:41
		01.03.2017 5:42
...
Рейтинг: 0 / 0
13.09.2018, 18:01
    #39702292
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицу саму с собой
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with cteData (UserId, Event, Date)
as (
              select 1, 1, cast('20180101' as date)
    union all select 1, 2, cast('20180102' as date)
    union all select 1, 2, cast('20180103' as date)
    union all select 1, 1, cast('20180104' as date)
    union all select 2, 1, cast('20180105' as date)
    union all select 2, 1, cast('20180106' as date)
)
select d.UserId
     , d.Event
     , d.Date
     , lag(d.Date) over (partition by d.UserId, d.Event order by d.Date) as PrevDate
from cteData d
group by d.UserId, d.Event, d.Date



lag доступен начиная с sql server 2012
...
Рейтинг: 0 / 0
13.09.2018, 18:27
    #39702299
myrzilka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицу саму с собой
Супер. Это сработало! А как показать только те записи, у которых разница между датами от 0 до 60 минут?
Пробую в секунды перевести datediff (s, PrevDate, d.Date) between 0 and 3599
Но ругается, что нельзя windows функцию использовать в where ((
...
Рейтинг: 0 / 0
13.09.2018, 18:48
    #39702314
londinium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицу саму с собой
myrzilka,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with cteData (UserId, Event, Date)
as (
              select 1, 1, cast('20180101' as date)
    union all select 1, 2, cast('20180102' as date)
    union all select 1, 2, cast('20180103' as date)
    union all select 1, 1, cast('20180104' as date)
    union all select 2, 1, cast('20180105' as date)
    union all select 2, 1, cast('20180106' as date)
),
PrevNext AS
(
select d.UserId
     , d.Event
     , d.Date
     , lag(d.Date) over (partition by d.UserId, d.Event order by d.Date) as PrevDate
from cteData d
group by d.UserId, d.Event, d.Date
)
SELECT P.USERID,P.EVENT,P.DATE,P.PREVDATE
FROM PREVNEXT P
WHERE  datediff (s, PrevDate, d.Date) between 0 and 3599
...
Рейтинг: 0 / 0
13.09.2018, 20:21
    #39702330
myrzilka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицу саму с собой
Спасибо большое!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Соединить таблицу саму с собой / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]