Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помощь с запросом. / 16 сообщений из 16, страница 1 из 1
09.01.2020, 13:25
    #39911969
479didi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
Подскажите пожалуйста sql запрос, есть столбец типа дата и время и нужно получить записи.
Пример дай мне все записи у которых разница между первым полем и вторым по времени меньше или равно 2 мс.

Версия:
Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Feb 20 2014 20:04:26 Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
...
Рейтинг: 0 / 0
09.01.2020, 13:27
    #39911972
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
...
Рейтинг: 0 / 0
09.01.2020, 13:50
    #39911984
iiyama
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
479didi,

lead
...
Рейтинг: 0 / 0
09.01.2020, 13:54
    #39911987
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
479didi,

Имелось ввиду это

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
-- Тестовые данныe
DECLARE @t AS TABLE(dt DATETIME2(3) NOT NULL /*увеличил точность даты, чтобы не терять миллисекунды */);

INSERT INTO @t(dt)
SELECT '20190101 00:00:00.000' UNION ALL 
SELECT '20190101 00:00:00.001' UNION ALL 
SELECT '20190101 00:00:00.005' UNION ALL 
SELECT '20190101 00:00:00.006' UNION ALL 
SELECT '20190101 00:00:00.009' UNION ALL 
SELECT '20190101 00:00:00.010' UNION ALL 
SELECT '20190101 00:00:00.020' UNION ALL 
SELECT '20190101 00:00:00.050' UNION ALL 
SELECT '20190101 00:00:00.052'; 

-- Запрос
WITH a
     AS (
     SELECT 
            dt
          , DATEDIFF(MILLISECOND, dt, LEAD(dt) OVER(ORDER BY dt ASC)) AS delta
     FROM 
          @t)
     SELECT 
            dt
     FROM 
          a
     WHERE delta <= 2;



или это

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
-- Тестовые данные
DECLARE @t AS TABLE(dt1 DATETIME2(3) NOT NULL, dt2 DATETIME2(3) NOT NULL);
INSERT INTO @t(dt1, dt2)
SELECT '20190101 00:00:00.000', '20190101 00:00:00.001' UNION ALL 
SELECT '20190101 00:00:00.005', '20190101 00:00:00.006'  UNION ALL 
SELECT '20190101 00:00:00.009', '20190101 00:00:00.010' UNION ALL 
SELECT '20190101 00:00:00.020', '20190101 00:00:00.050' UNION ALL 
SELECT '20190101 00:00:00.052', '20190101 00:00:00.056' 

-- Запрос
SELECT 
       dt1
     , dt2
FROM 
     @t
WHERE ABS(DATEDIFF(MILLISECOND, dt1, dt2)) <= 2;  
...
Рейтинг: 0 / 0
09.01.2020, 15:39
    #39912075
479didi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
entrypoint,
Вопрос по первому запросу
Имеется один столбец с датами и типом дата и время,
Название таблицы:zline, столбец: date.

Выполняю запрос
WITH zline
AS (
SELECT
date
, DATEDIFF(MILLISECOND, date, LEAD(date) OVER(ORDER BY date ASC)) AS delta
FROM
zline)
SELECT
date
FROM
zline
WHERE delta <= 2;

Выскакивает сообщение:
Сообщение 195, уровень 15, состояние 10, строка 6
LEAD не является известным имя встроенной функции.

Строка:
, DATEDIFF(MILLISECOND, date, LEAD(date) OVER(ORDER BY date ASC)) AS delta


Таблица:
Date1111111111111111111idline
2019-09-23 18:49:44.917 13039
2019-09-23 18:52:01.760 13038
2019-09-23 18:52:13.980 13038
2019-09-23 18:52:35.810 13038
2019-09-23 18:53:13.840 13039
...
Рейтинг: 0 / 0
09.01.2020, 15:53
    #39912089
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
479didi,

У Вас точно MSSQL 2014 и уровень совместимости выставлен как MSSQL 2014 ?
...
Рейтинг: 0 / 0
09.01.2020, 16:26
    #39912112
479didi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
entrypoint,
Да вы правы была другая версия, но после выполнения появилась другая ошибка:


Recursive common table expression 'zline' does not contain a top-level UNION ALL operator.
...
Рейтинг: 0 / 0
09.01.2020, 17:38
    #39912149
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
479didi,

Точно скопируйте пример и убедитесь что в окне выполнения нет никакого другого кода
Ругань на объект "zline"

Такого объекта в моем примере нет, т.е. это какой-то чужой кусок от того что вы делали до этого, или что-то изменяли

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
-- Тестовые данные
DECLARE @zline AS TABLE
                        ([date] DATETIME2(3) NOT NULL
                       , idline INT NOT NULL
                        ); 

INSERT INTO @zline ([date], idline)
SELECT '20190923 18:49:44.917', 13039 UNION ALL
SELECT '20190923 18:49:44.919', 13039 UNION ALL
SELECT '20190923 18:52:01.760', 13038 UNION ALL
SELECT '20190923 18:52:13.980', 13038 UNION ALL
SELECT '20190923 18:52:35.810', 13038 UNION ALL
SELECT '20190923 18:52:35.811', 13038 UNION ALL
SELECT '20190923 18:53:13.840', 13039;

-- Запрос
WITH zline
     AS (
     SELECT 
            [date]
          , idLine
          , DATEDIFF(MILLISECOND, [date], LEAD([date]) OVER(ORDER BY [date] ASC)) AS delta
     FROM 
          @zline)
     SELECT 
            idline
          , [date]
     FROM 
          zline
     WHERE delta <= 2;
...
Рейтинг: 0 / 0
10.01.2020, 13:03
    #39912375
479didi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
entrypoint,
имя моей таблицы"zline"
Имя столбца "date", "idline"
Как правильно выполнить запрос уже с существующей таблицей?

А так же вопрос, ваш запрос возвращает на примере тестовой таблице только одну запись подходящую по условию например:
'20190101 00:00:00.000'
'20190101 00:00:00.001'

Две записи, возвращает только первую, можно ли сделать так что б возвращал обе?
...
Рейтинг: 0 / 0
10.01.2020, 13:08
    #39912377
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
479didi,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
-- Запрос
;WITH z
     AS (
     SELECT 
            [date]
          , idLine
          , DATEDIFF(MILLISECOND, [date], LEAD([date]) OVER(ORDER BY [date] ASC)) AS delta
     FROM 
          dbo.zline)
     SELECT 
            idline
          , [date]
     FROM 
          z
     WHERE delta <= 2;
...
Рейтинг: 0 / 0
10.01.2020, 13:12
    #39912379
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
479didi
entrypoint,
имя моей таблицы"zline"
Имя столбца "date", "idline"
Как правильно выполнить запрос уже с существующей таблицей?

А так же вопрос, ваш запрос возвращает на примере тестовой таблице только одну запись подходящую по условию например:
'20190101 00:00:00.000'
'20190101 00:00:00.001'

Две записи, возвращает только первую, можно ли сделать так что б возвращал обе?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
-- Тестовые данные
DECLARE @zline AS TABLE
                        ([date] DATETIME2(3) NOT NULL
                       , idline INT NOT NULL
                        ); 

INSERT INTO @zline ([date], idline)
SELECT '20190923 18:49:44.917', 13039 UNION ALL
SELECT '20190923 18:49:44.919', 13039 UNION ALL
SELECT '20190923 18:52:01.760', 13038 UNION ALL
SELECT '20190923 18:52:13.980', 13038 UNION ALL
SELECT '20190923 18:52:35.810', 13038 UNION ALL
SELECT '20190923 18:52:35.811', 13038 UNION ALL
SELECT '20190923 18:53:13.840', 13039;

-- Запрос
WITH z
     AS (
     SELECT 
            [date]
          , idLine
          , DATEDIFF(MILLISECOND, [date], LEAD([date]) OVER(ORDER BY [date] ASC)) AS delta_lead
          , DATEDIFF(MILLISECOND, LAG([date]) OVER(ORDER BY [date] ASC), [date]) AS  delta_lag
     FROM 
          @zline)
     SELECT 
            idline
          , [date]
     FROM 
          z
     WHERE delta_lead <= 2
           OR delta_lag <= 2;



В Вашем случае
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
-- Запрос
WITH z
     AS (
     SELECT 
            [date]
          , idLine
          , DATEDIFF(MILLISECOND, [date], LEAD([date]) OVER(ORDER BY [date] ASC)) AS delta_lead
          , DATEDIFF(MILLISECOND, LAG([date]) OVER(ORDER BY [date] ASC), [date]) AS  delta_lag
     FROM 
          dbo.zline)
     SELECT 
            idline
          , [date]
     FROM 
          z
     WHERE delta_lead <= 2
           OR delta_lag <= 2;
...
Рейтинг: 0 / 0
10.01.2020, 13:29
    #39912385
479didi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
entrypoint,
Извиняюсь за большое количество вопросов и затраченное ваше время.

Возникает ошибка:
Сообщение 535, уровень 16, состояние 0, строка 1
The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.
Не подскажете в чем причина?

Попробовал изменить на секунды, запрос работает.
...
Рейтинг: 0 / 0
10.01.2020, 13:30
    #39912386
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
479didi,

Миллисекунд получается много, выходит за пределы значений
...
Рейтинг: 0 / 0
10.01.2020, 13:40
    #39912390
479didi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
entrypoint,
Можно ли как то обойти это?
Или только в секундах можно будет?
...
Рейтинг: 0 / 0
10.01.2020, 13:55
    #39912398
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
479didi
entrypoint,
Можно ли как то обойти это?
Или только в секундах можно будет?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
-- Тестовые данные
DECLARE @zline AS TABLE
                        ([date] DATETIME2(3) NOT NULL
                       , idline INT NOT NULL
                        ); 

INSERT INTO @zline ([date], idline)
SELECT '20190923 18:49:44.917', 13039 UNION ALL
SELECT '20190923 18:49:44.919', 13039 UNION ALL
SELECT '20190923 18:52:01.760', 13038 UNION ALL
SELECT '20190923 18:52:13.980', 13038 UNION ALL
SELECT '20190923 18:52:35.810', 13038 UNION ALL
SELECT '20190923 18:52:35.811', 13038 UNION ALL
SELECT '20190923 18:53:13.840', 13039;

-- Запрос
WITH z
     AS (
     SELECT 
            [date]
          , idLine
          , CASE DATEDIFF(DAY, [date], LEAD([date]) OVER(ORDER BY [date] ASC))
                WHEN 0 THEN DATEDIFF(MILLISECOND, [date], LEAD([date]) OVER(ORDER BY [date] ASC))
            END AS delta_lead
          , CASE DATEDIFF(DAY, LAG([date]) OVER(ORDER BY [date] ASC), [date])
                WHEN 0 THEN DATEDIFF(MILLISECOND, LAG([date]) OVER(ORDER BY [date] ASC), [date])
            END AS delta_lag
     FROM 
          @zline)
     SELECT 
            idline
          , [date]
     FROM 
          z
     WHERE delta_lead <= 2
           OR delta_lag <= 2;
...
Рейтинг: 0 / 0
10.01.2020, 14:19
    #39912410
479didi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь с запросом.
entrypoint,
Спасибо вам большое!!!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помощь с запросом. / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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