Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Соединить таблицу саму с собой  [new]
myrzilka
Member

Откуда:
Сообщений: 54
Помогите, пожалуйста, никак не могу склеить таблицу.

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

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

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

Подскажите, пожалуйста.
Мне потом эти даты еще вычитать между собой надо.
13 сен 18, 17:19    [21673978]     Ответить | Цитировать Сообщить модератору
 Re: Соединить таблицу саму с собой  [new]
Владимир Затуливетер
Member

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

Это вам нужно? Если нет, то подробней задачу опишите, желательно с тестовыми данными и необходимым результатом.
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


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)
13 сен 18, 17:43    [21674024]     Ответить | Цитировать Сообщить модератору
 Re: Соединить таблицу саму с собой  [new]
myrzilka
Member

Откуда:
Сообщений: 54
надо получить не минимум и максимум, а последовательные даты. Что-то вроде этого
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


К сообщению приложен файл. Размер - 8Kb
13 сен 18, 17:58    [21674047]     Ответить | Цитировать Сообщить модератору
 Re: Соединить таблицу саму с собой  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
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
13 сен 18, 18:01    [21674056]     Ответить | Цитировать Сообщить модератору
 Re: Соединить таблицу саму с собой  [new]
myrzilka
Member

Откуда:
Сообщений: 54
Супер. Это сработало! А как показать только те записи, у которых разница между датами от 0 до 60 минут?
Пробую в секунды перевести datediff (s, PrevDate, d.Date) between 0 and 3599
Но ругается, что нельзя windows функцию использовать в where ((
13 сен 18, 18:27    [21674079]     Ответить | Цитировать Сообщить модератору
 Re: Соединить таблицу саму с собой  [new]
londinium
Member

Откуда: Киев
Сообщений: 1138
myrzilka,
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
13 сен 18, 18:48    [21674115]     Ответить | Цитировать Сообщить модератору
 Re: Соединить таблицу саму с собой  [new]
myrzilka
Member

Откуда:
Сообщений: 54
Спасибо большое!
13 сен 18, 20:21    [21674168]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить