Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,325

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

15.11.2018, 15:09. Показов 929. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2018, 15:09
Ответы с готовыми решениями:

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

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

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

9
311 / 271 / 118
Регистрация: 05.06.2013
Сообщений: 868
15.11.2018, 19:20
Цитата Сообщение от 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
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
16.11.2018, 10:12
Цитата Сообщение от Jefe Посмотреть сообщение
В MSSQL, кажется, нет аналога rownum, поэтому надо будет искуственно проставить нумерацию строк, по которой сортировать
ROW_NUMBER() если версия сервера позволяет
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
16.11.2018, 11:49
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
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,325
19.11.2018, 11:03  [ТС]
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
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
19.11.2018, 11:48
UseMuse, ваш скрипт нерабочий т.к. не соответствует примеру и структуре данных из стартового поста.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,325
19.11.2018, 12:23  [ТС]
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
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
19.11.2018, 12:40
UseMuse, первое и самое главное - должен быть столбец, определяющий порядок строк.
Без такового задача не имеет решения. Вообще.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,325
19.11.2018, 12:52  [ТС]
invm, мне мой вариант устраивает, хотел просто посмотреть другую реализацию такого же результата
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
19.11.2018, 13:01
Цитата Сообщение от UseMuse Посмотреть сообщение
invm, мне мой вариант устраивает
Ок.
Возвращайтесь, когда получите неправильный результат.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.11.2018, 13:01
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru