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

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

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

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

Подскажите, пожалуйста.
Мне потом эти даты еще вычитать между собой надо.
...
Рейтинг: 0 / 0
Соединить таблицу саму с собой
    #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
Соединить таблицу саму с собой
    #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
Соединить таблицу саму с собой
    #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
Соединить таблицу саму с собой
    #39702299
myrzilka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Супер. Это сработало! А как показать только те записи, у которых разница между датами от 0 до 60 минут?
Пробую в секунды перевести datediff (s, PrevDate, d.Date) between 0 and 3599
Но ругается, что нельзя windows функцию использовать в where ((
...
Рейтинг: 0 / 0
Соединить таблицу саму с собой
    #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
Соединить таблицу саму с собой
    #39702330
myrzilka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Соединить таблицу саму с собой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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