Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
100 / 102 / 42
Регистрация: 11.01.2016
Сообщений: 903
1

Анрил таск. Преобразование данных

15.11.2018, 15:09. Просмотров 558. Ответов 9


T-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
--таблица данных, в которой хранится  информация о пути проделанном из точки А в точку Б, 
-- во время пути были стоянки
--ParkingTime секунды простоя на парковке
--dist пройденный путь от одной записи к другой
DECLARE @DataPath TABLE (ParkingTime bigint, dist int, recordDate datetime)
 
INSERT @DataPath VALUES (37520300000,0,GETDATE())
                            ,(930300000,28,GETDATE())
                            ,(0,42,GETDATE())
                            ,(0,64,GETDATE())
                            ,(200000000,58,GETDATE())
                            ,(0,65,GETDATE())
                            ,(0,84,GETDATE())
                            ,(0,83,GETDATE())
                            ,(0,76,GETDATE())
 
-- нужно из таблицы @DataPath записать данные в новую результирующую таблицу
 
-- Number 
--,  первая запись number = 1 
-- Number увеличивать  каждый раз на 1, если данные ParkingTime > 0 из таблицы  @DataPath
-- получится для первых 5 объектов из таблицы @DataPath результат для поля Number будет : 1, 2, 2, 2, 3
 
-- ParkingTime секунды переконвертировать в time
 
-- all_dist = текущее значение dist + предудущие значение dist
 
-- dist_from_prev_parking расстояние от текущей записи до  предыдущей парковки 
 
-- dist - это dist из таблицы  @DataPath 
-- recordTime записать время  из recordDate
-- recordTimePlusparkingTime записать время  из recordDate + ParkingTime
-- recordDate - это данные из recordDate
DECLARE @DataResult TABLE (Number int , ParkingTime time , all_dist int, dist_from_prev_parking int null, dist int
                                        , recordTime time, recordTimePlusparkingTime time, recordDate datetime)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2018, 15:09
Ответы с готовыми решениями:

таск 8
Создать новый квадратный двумерный массив из переданного двумерного массива, обрезав от последнего...

Таск киллер
Всем привет. Прошу Вашей помощи... Мне необходимо написать программу которая запускалась бы в фоне...

Не MainForm на таск баре
У меня есть несколько форм в проекте - главная, что то типа сплэша, форма коннекта к дб (если файл...

Окошко на таск баре
Доброго всем времени суток! Подскажите как убирать окошко с таск бара при свёртывание программы в ...

9
295 / 262 / 111
Регистрация: 05.06.2013
Сообщений: 836
15.11.2018, 19:20 2
Цитата Сообщение от UseMuse Посмотреть сообщение
-- Number
--, *первая запись number = 1
-- Number увеличивать *каждый раз на 1, если данные ParkingTime > 0 из таблицы *@DataPath
-- получится для первых 5 объектов из таблицы @DataPath результат для поля Number будет : 1, 2, 2, 2, 3
в оракле это можно сделать так:
SQL
1
SUM(CASE WHEN PARKINGTIME <> 0 THEN 1 END) OVER (ORDER BY rownum) AS "Number"
В MSSQL, кажется, нет аналога rownum, поэтому надо будет искуственно проставить нумерацию строк, по которой сортировать

Добавлено через 2 минуты
Цитата Сообщение от UseMuse Посмотреть сообщение
-- ParkingTime секунды переконвертировать в time
37520300000 секунд это более 1000 лет, может надо отбросить несколько нулей?

Добавлено через 1 минуту
Цитата Сообщение от UseMuse Посмотреть сообщение
-- all_dist = текущее значение dist + предудущие значение dist
SQL
1
SUM(dist) OVER (ORDER BY <столбец с порядком>)
Добавлено через 4 минуты
Цитата Сообщение от UseMuse Посмотреть сообщение
-- dist_from_prev_parking расстояние от текущей записи до *предыдущей парковки
надо пример на исходных данных, посчитать это вручную и показать для какой строки каким значением это должно быть. слишком много вариантов как это можно посчитать по разному.
0
1514 / 1079 / 151
Регистрация: 23.07.2010
Сообщений: 5,946
16.11.2018, 10:12 3
Цитата Сообщение от Jefe Посмотреть сообщение
В MSSQL, кажется, нет аналога rownum, поэтому надо будет искуственно проставить нумерацию строк, по которой сортировать
ROW_NUMBER() если версия сервера позволяет
0
3113 / 1873 / 663
Регистрация: 02.06.2013
Сообщений: 4,615
16.11.2018, 11:49 4
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
with t as
(
 select
  sum(case when ParkingTime = 0 then 0 else 1 end) over (order by recordDate) as Number,
  sum(dist) over (order by recordDate) as all_dist,
  * 
 from
  @Datapath
)
select
 Number, ParkingTime, all_dist,
 sum(dist) over (partition by Number order by recordDate) - first_value(dist) over (partition by Number order by recordDate) as dist_from_prev_parking,
 dist, recordDate
from
 t
order by
 recordDate;
С таймами либо разбирайтесь сами, либо внятно обьъясните, что это и как их нужно обработать.
0
100 / 102 / 42
Регистрация: 11.01.2016
Сообщений: 903
19.11.2018, 11:03  [ТС] 5
invm, доброе утро, такой должен быть ожидаемый результат.
Можно ли мой вариант более элегантнее чтоли написать?
T-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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    DECLARE @Number smallint = null
    DECLARE @Distance decimal(7,2)
    DECLARE @pre_dist decimal(7,2)
    DECLARE @dist_covered decimal(7,2) = 0
    DECLARE @dist_from_prev_parking decimal(7,2) = null
 
    DECLARE @ParkingTime bigint
    DECLARE @recordDate datetime
 
    DECLARE StageCursor CURSOR FOR
 
    SELECT 
           datas.ParkingTime AS ParkingTime,
             -- время записи предыдущей записи
           LAG(datas.dist, 1) OVER(ORDER BY datas.recordDate),
           datas.dist,
           datas.recordDate
         
    FROM @Datapath as datas
    OPEN StageCursor 
    FETCH NEXT FROM StageCursor INTO  @ParkingTime,@pre_dist,@Distance,@recordDate
    WHILE @@FETCH_STATUS = 0
    BEGIN
 
    DECLARE @IsFirst BIT  = 0
    DECLARE @IsParking BIT  = 0
 
        -- Первая запись
        IF @Number IS NULL
        BEGIN
            SET @IsFirst = 1
            SET @Number = 1 
            SET @Distance = 0
            SET @ParkingTime = 0
        END
 
        IF (@ParkingTime>0) 
        BEGIN
            SET @IsParking = 1
            if(@IsFirst = 0)
            SET @Number = @Number + 1
        END
 
        if(@IsFirst = 0)
        SET @dist_from_prev_parking = @dist_from_prev_parking + @Distance 
 
        SET @dist_covered = @dist_covered + @Distance
        DECLARE @ForInsertParkingTime time =  CONVERT(VARCHAR(12),DATEADD(SECOND, @ParkingTime / 10000000, '19700101 00:00'), 114)
 
        INSERT INTO @Result VALUES(@Number, @ForInsertParkingTime,@Distance /1000,
         @dist_from_prev_parking /1000,@dist_covered /1000,@recordDate)
 
        IF (@IsParking = 1) 
            SET @dist_from_prev_parking = 0
 
        -- Следующий элемент курсора ячеек, пока есть записи
        FETCH NEXT FROM StageCursor INTO   @ParkingTime,@pre_dist,@Distance,@recordDate
    END
    CLOSE StageCursor
    DEALLOCATE StageCursor
 
--вывод результата. Ожидаемый результат
    select * from @Result
Добавлено через 1 минуту
Цитата Сообщение от Jefe Посмотреть сообщение
37520300000 секунд это более 1000 лет, может надо отбросить несколько нулей?
Это в тиках, чтобы конвертировать тики в секунды нужно тики разделить на 10000000
0
3113 / 1873 / 663
Регистрация: 02.06.2013
Сообщений: 4,615
19.11.2018, 11:48 6
UseMuse, ваш скрипт нерабочий т.к. не соответствует примеру и структуре данных из стартового поста.
0
100 / 102 / 42
Регистрация: 11.01.2016
Сообщений: 903
19.11.2018, 12:23  [ТС] 7
invm,
T-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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
--таблица данных, в которой хранится  информация о пути проделанном из точки А в точку Б, 
-- во время пути были стоянки
--ParkingTime секунды простоя на парковке
--dist пройденный путь от одной записи к другой
DECLARE @DataPath TABLE (ParkingTime bigint, dist int, recordDate  datetime)
 
INSERT @DataPath VALUES (37520300000,0,GETDATE())
                            ,(930300000,28,GETDATE())
                            ,(0,42,GETDATE())
                            ,(0,64,GETDATE())
                            ,(200000000,58,GETDATE())
                            ,(0,65,GETDATE())
                            ,(0,84,GETDATE())
                            ,(0,83,GETDATE())
                            ,(0,76,GETDATE())
 
                            select * from @DataPath
-- нужно из таблицы @DataPath записать данные в новую результирующую таблицу
 
-- Number 
--,  первая запись number = 1 
-- Number увеличивать  каждый раз на 1, если данные ParkingTime > 0 из таблицы  @DataPath
-- получится для первых 5 объектов из таблицы @DataPath результат для поля Number будет : 1, 2, 2, 2, 3
 
-- ParkingTime секунды переконвертировать в time
 
-- all_dist = текущее значение dist + предудущие значение dist, 
-- получится для первых 5 объектов из таблицы @DataPath результат для поля all_dist будет : 42,70,112,176,234 
 
-- dist_from_prev_parking расстояние от текущей записи до  предыдущей парковки 
 
-- dist - это dist из таблицы  @DataPath 
-- recordTime записать время  из recordDate 
-- recordTimePlusparkingTime записать время  из recordDate  + ParkingTime
-- recordDate  - это данные из recordDate 
DECLARE @Result TABLE (Number int , ParkingTime time , dist decimal(7,2), dist_from_prev_parking decimal(7,2) null
                                        , dist_covered decimal(7,2), recordDate  datetime);
 
    DECLARE @Number smallint = null
    DECLARE @Distance decimal(7,2)
    DECLARE @pre_dist decimal(7,2)
    DECLARE @dist_covered decimal(7,2) = 0
    DECLARE @dist_from_prev_parking decimal(7,2) = null
 
    DECLARE @ParkingTime bigint
    DECLARE @recordDate  datetime
 
    DECLARE StageCursor CURSOR FOR
 
    SELECT 
           datas.ParkingTime AS ParkingTime,
             -- время записи предыдущей записи
           LAG(datas.dist, 1) OVER(ORDER BY datas.recordDate ),
           datas.dist,
           datas.recordDate 
         
    FROM @DataPath as datas
    OPEN StageCursor 
    FETCH NEXT FROM StageCursor INTO  @ParkingTime,@pre_dist,@Distance,@recordDate 
    WHILE @@FETCH_STATUS = 0
    BEGIN
 
    DECLARE @IsFirst BIT  = 0
    DECLARE @IsParking BIT  = 0
 
        -- Первая запись
        IF @Number IS NULL
        BEGIN
            SET @IsFirst = 1
            SET @Number = 1 
            SET @Distance = 0
            SET @ParkingTime = 0
        END
 
        IF (@ParkingTime>0) 
        BEGIN
            SET @IsParking = 1
            if(@IsFirst = 0)
            SET @Number = @Number + 1
        END
 
        if(@IsFirst = 0)
        SET @dist_from_prev_parking = @dist_from_prev_parking + @Distance 
 
        SET @dist_covered = @dist_covered + @Distance
        DECLARE @ForInsertParkingTime time =  CONVERT(VARCHAR(12),DATEADD(SECOND, @ParkingTime / 10000000, '19700101 00:00'), 114)
 
        INSERT INTO @Result VALUES(@Number, @ForInsertParkingTime,@Distance /1000,
         @dist_from_prev_parking /1000,@dist_covered /1000,@recordDate )
 
        IF (@IsParking = 1) 
            SET @dist_from_prev_parking = 0
 
        -- Следующий элемент курсора ячеек, пока есть записи
        FETCH NEXT FROM StageCursor INTO   @ParkingTime,@pre_dist,@Distance,@recordDate 
    END
    CLOSE StageCursor
    DEALLOCATE StageCursor
 
 
    select * from @Result
0
3113 / 1873 / 663
Регистрация: 02.06.2013
Сообщений: 4,615
19.11.2018, 12:40 8
UseMuse, первое и самое главное - должен быть столбец, определяющий порядок строк.
Без такового задача не имеет решения. Вообще.
0
100 / 102 / 42
Регистрация: 11.01.2016
Сообщений: 903
19.11.2018, 12:52  [ТС] 9
invm, мне мой вариант устраивает, хотел просто посмотреть другую реализацию такого же результата
0
3113 / 1873 / 663
Регистрация: 02.06.2013
Сообщений: 4,615
19.11.2018, 13:01 10
Цитата Сообщение от UseMuse Посмотреть сообщение
invm, мне мой вариант устраивает
Ок.
Возвращайтесь, когда получите неправильный результат.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2018, 13:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Таск List<String>
Добрый день! надо решить такую задачку Я написала что-то вроде этого, но у меня не выводит мой...

WindowsForm и работа по Schedule Таск
Как совместить 2 части в одной программе 1.WindowsForm(пользователь производит начальные установки)...

FreeRTOS и опрос кнопок и передача в таск
Не могу придумать в голове как передать состояние кнопок из одной задачи в другую. Задачу ставлю...

Как лучше реализовать таск-менеджер?
Вопрос: я выполняю тестовое задание. Мне нужно разработать таск-менеджер на Bitrix. Функциональные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.