Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / найти разницу времени между строками одного запроса / 18 сообщений из 18, страница 1 из 1
24.05.2020, 19:17
    #39961400
rtyts
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
Добрый день! Исходные данные на картинке. Запрос делает выборку и сортирует по START_DT. Как бы к этой выборке написать запрос, который бы из следующего START_DT вычитал бы дату предыдущего END_DT. А результат писать в первую строку в доп колонку.
Куда смотреть, какую функцию покурить?
Спасибо!
...
Рейтинг: 0 / 0
24.05.2020, 19:18
    #39961401
rtyts
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
прошу простить, на картинке наоборот написано, что от чего отнимать, но сути это не меняет. нужна разность дат между строками.
...
Рейтинг: 0 / 0
24.05.2020, 19:21
    #39961403
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
rtyts
Куда смотреть, какую функцию покурить?
LAG, LEAD?
...
Рейтинг: 0 / 0
24.05.2020, 19:46
    #39961411
Нестандартное мышление
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
alexeyvg
rtyts
Куда смотреть, какую функцию покурить?
LAG, LEAD?

Это спасет. Но если версия сервера позволяет. а так - JOIN с ближайшей строкой
...
Рейтинг: 0 / 0
24.05.2020, 20:58
    #39961425
rtyts
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
А как "заджоинить" ближайшую строку, подскажите плиз?
...
Рейтинг: 0 / 0
24.05.2020, 21:15
    #39961428
Нестандартное мышление
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
rtyts
А как "заджоинить" ближайшую строку, подскажите плиз?

по ближайшему ID
условия писать умеете?
MIN(ID) который больше чем текущий ID
...
Рейтинг: 0 / 0
24.05.2020, 21:17
    #39961430
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
Нестандартное мышление
rtyts
А как "заджоинить" ближайшую строку, подскажите плиз?

по ближайшему ID
условия писать умеете?
MIN(ID) который больше чем текущий ID
Или пронумеровать строки, например, в CTE

rtyts, вы бы сказали версию, а то сколько решений нужно найти, прежде чем выяснится, для какой версии их нужно искать?
...
Рейтинг: 0 / 0
25.05.2020, 08:24
    #39961519
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
rtyts
А как "заджоинить" ближайшую строку, подскажите плиз?


Не надо ничего Джойнить. Это 15-летняя давность. "Скользящее окно" -- выясните для себя, что это такое и джойнов в вашей жизни станет меньше.
Код: sql
1.
2.
SELECT DATEDIFF(day, END_DT , LEAD(START_DT) OVER (ORDER BY ID)) AS DIFF 
FROM ...
...
Рейтинг: 0 / 0
25.05.2020, 08:31
    #39961523
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
a_voronin
rtytsА как "заджоинить" ближайшую строку, подскажите плиз?


Не надо ничего Джойнить. Это 15-летняя давность. "Скользящее окно" -- выясните для себя, что это такое и джойнов в вашей жизни станет меньше.Джойнить - это был ответ на утверждение ТС, что скользящее окно не поддерживается версией.
...
Рейтинг: 0 / 0
25.05.2020, 09:20
    #39961533
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
alexeyvg
это был ответ на утверждение ТС, что скользящее окно не поддерживается версией.


Я чего-то не вижу такого утверждения от ТС. LEAD LAG c 2012.
...
Рейтинг: 0 / 0
25.05.2020, 13:00
    #39961655
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
a_voronin
alexeyvg
это был ответ на утверждение ТС, что скользящее окно не поддерживается версией.


Я чего-то не вижу такого утверждения от ТС. LEAD LAG c 2012.
Ну вот, после решения с LEAD LAG ТС спросил:
rtyts
А как "заджоинить" ближайшую строку, подскажите плиз?
Значит, версия старее.

Иначе зачем бы ему искать громоздкое, сложное, медленное решение, вместо простого и быстрого?
...
Рейтинг: 0 / 0
25.05.2020, 13:09
    #39961659
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
alexeyvg
a_voronin
пропущено...


Я чего-то не вижу такого утверждения от ТС. LEAD LAG c 2012.
Ну вот, после решения с LEAD LAG ТС спросил:
rtyts
А как "заджоинить" ближайшую строку, подскажите плиз?
Значит, версия старее.

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


Не очевидно. Пусть TC сам скажет версию своего мегасервака, а мы не будем гадать на скульной гуще.
...
Рейтинг: 0 / 0
25.05.2020, 13:26
    #39961669
godsql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
rtyts,
rtyts
А как "заджоинить" ближайшую строку, подскажите плиз?

пронумеровать, отсортировав по времени, скажем, row_number(), а потом соединить на основании этих номеров
...
Рейтинг: 0 / 0
25.05.2020, 22:43
    #39961899
rtyts
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
Всем Спасибо! Сделаю через OVER. Версия
Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (Intel X86)
Jun 17 2016 19:21:56
Copyright (c) Microsoft Corporation
Express Edition on Windows NT 6.3 <X64> (Build 18363: ) (WOW64)

сорри, что не указал вначале, как должно было бы.
...
Рейтинг: 0 / 0
26.05.2020, 20:33
    #39962502
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
godsql
rtyts,
rtyts
А как "заджоинить" ближайшую строку, подскажите плиз?

пронумеровать, отсортировав по времени, скажем, row_number(), а потом соединить на основании этих номеров

Причем, возможно, это даже быстрее будет, чем вариант с LAG/LEAD
...
Рейтинг: 0 / 0
27.05.2020, 08:27
    #39962665
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
uaggster
godsql
rtyts,

пронумеровать, отсортировав по времени, скажем, row_number(), а потом соединить на основании этих номеров

Причем, возможно, это даже быстрее будет, чем вариант с LAG/LEAD
Разве?
LAG/LEAD работает с потоком, просто храня в переменных следующие/предыдущие записи, а соединение по номеру делает джойн двух множеств записей.

Не сравнивал, но теоретически LAG/LEAD должны быть намного быстрее.
...
Рейтинг: 0 / 0
27.05.2020, 13:32
    #39962789
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
Тогда если сравнивать производительность, то следует добавить и однопроходное нелаговое/лидовое.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
declare @t table(k int primary key, v int)
insert into @t
values (0, null), (1, -1), (2, 1), (3, 2), (4, 2), (5, 7), (6, 8), (7, 4), (8, 1), (9, 3), (10, 0), (11, 8), (12, 9), (13, 10), (14, 11);

with A as
(select this_k = max(case when e.x  = (b.r % 2) then b.k end),
        this_v = max(case when e.x  = (b.r % 2) then b.v end),
        next_v = max(case when e.x != (b.r % 2) then b.v end)
   from (select a.v, a.k, row_number() over(order by a.k) as r
           from @t as a) as b
          cross join (select 0 as x union all select 1 as x) as e
  group by b.r + case when e.x = (b.r % 2) then 1 else 0 end
/*  order by this_k
 offset 1 rows
*/)
 
select this_k, this_v, next_v
  from A
 where this_k is not null

...
Рейтинг: 0 / 0
27.05.2020, 13:35
    #39962793
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти разницу времени между строками одного запроса
nullin
Тогда если сравнивать производительность, то следует добавить и однопроходное нелаговое/лидовое.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
declare @t table(k int primary key, v int)
insert into @t
values (0, null), (1, -1), (2, 1), (3, 2), (4, 2), (5, 7), (6, 8), (7, 4), (8, 1), (9, 3), (10, 0), (11, 8), (12, 9), (13, 10), (14, 11);

with A as
(select this_k = max(case when e.x  = (b.r % 2) then b.k end),
        this_v = max(case when e.x  = (b.r % 2) then b.v end),
        next_v = max(case when e.x != (b.r % 2) then b.v end)
   from (select a.v, a.k, row_number() over(order by a.k) as r
           from @t as a) as b
          cross join (select 0 as x union all select 1 as x) as e
  group by b.r + case when e.x = (b.r % 2) then 1 else 0 end
/*  order by this_k
 offset 1 rows
*/)
 
select this_k, this_v, next_v
  from A
 where this_k is not null


Спасибо, прикольный способ :-)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / найти разницу времени между строками одного запроса / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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