Продолжайте обновлять список при суммировании

В этом примере таблица чисел используется для получения ваших интервалов. Это быстрый и грязный бит кода и не предполагает, что у вас есть таблица существующих номеров. Для этого примера ваши образцы данных были загружены в глобальную временную таблицу с именем ## source_data.

SET NOCOUNT ON
-- Create a temporary numbers table to demonstrate its use. 
-- We only need numbers up to 47, but will be creating numbers up to 336 to cover
-- periods of up to a week. This table will also include zero.

Declare @DailyIntervals int = 48,
    @maxDays int = 7

-- This calculates the number of recursive inserts needed to reach your maximum value
-- NOTE: This is based off of manually inserting your first four values into the table first!

DECLARE @loop int
SET @loop = CEILING(LOG(@DailyIntervals * @maxDays, 2))-2
--SELECT @loop

Declare @m int
CREATE TABLE ##Nums (i int primary key clustered);

INSERT INTO ##Nums VALUES (1), (2), (3), (4);   -- Seed the table

SET @m = 4

WHILE @loop > 0
BEGIN
    INSERT INTO ##nums SELECT I + @m FROM ##Nums
    SET @m = @@ROWCOUNT * 2 -- max value in table now
    SET @loop = @loop - 1
END

INSERT INTO ##nums Values (0)   -- add the zero value

--SELECT MAX(I) FROM ##Nums

-- Look at July 11th only for now.
DECLARE @BeginDt datetime = '2018-07-11',
    @EndDt datetime = '2018-07-11';

-- Build a working table of half hour intervals
WITH hhrs as (
    SELECT Dateadd(MINUTE, 30 * i, @BeginDt) as StartTm,
        Dateadd(MINUTE, 30 * (i+1), @BeginDt) as EndTm
    FROM ##Nums
    WHERE i BETWEEN 0 and (DateDiff(Day, @BeginDt, @EndDt) * 48 + 47)
    ),
-- Get all of the data except duration
Src as (
    SELECT 
        sd.resourceid,
        sd.eventtype,
        CASE
            WHEN sd.eventstartdatetime <= StartTm
                THEN StartTm
            Else sd.eventstartdatetime
        End as EventStart,
        CASE
            WHEN sd.eventEnddatetime > EndTm
                THEN EndTm
            Else sd.eventenddatetime
        End as EventEnd
    FROM hhrs h
    INNER JOIN ##source_data sd
        ON sd.eventstartdatetime < EndTm
        AND sd.eventenddatetime >= StartTm
    )
-- Final output including duration
SELECT 
    ResourceID,
    EventType,
    EventStart,
    EventEnd,
    DateDiff(SECOND, EventStart, EventEnd) as Duration
FROM Src
ORDER BY EventStart, EventEnd
DROP TABLE ##Nums

Это результат, который я получил из ваших данных:

ResourceID EventType  EventStart                 EventEnd                   Duration
16278        6        2018-07-11 10:53:58.163    2018-07-11 11:00:00.000    362
16278        6        2018-07-11 11:00:00.000    2018-07-11 11:03:58.163    238
16278        3        2018-07-11 11:03:58.163    2018-07-11 11:16:29.970    751
16278        4        2018-07-11 11:16:29.970    2018-07-11 11:16:33.330    4
16278        5        2018-07-11 11:16:33.330    2018-07-11 11:24:06.977    453
16278        6        2018-07-11 11:24:06.977    2018-07-11 11:30:00.000    354
16278        6        2018-07-11 11:30:00.000    2018-07-11 11:31:31.633    91
16278        7        2018-07-11 11:31:31.633    2018-07-11 11:31:31.633    0
16278        1        2018-07-11 12:30:44.020    2018-07-11 13:00:00.000    1756
16278        2        2018-07-11 12:30:44.023    2018-07-11 12:33:23.437    159
16278        3        2018-07-11 12:33:23.437    2018-07-11 12:38:55.467    332
16278        4        2018-07-11 12:38:55.467    2018-07-11 12:38:58.677    3
16278        5        2018-07-11 12:38:58.677    2018-07-11 12:45:09.793    371
16278        6        2018-07-11 12:45:09.793    2018-07-11 12:47:20.173    131
16278        3        2018-07-11 12:47:20.173    2018-07-11 12:54:51.057    451
16278        4        2018-07-11 12:54:51.057    2018-07-11 12:54:53.383    2
16278        5        2018-07-11 12:54:53.383    2018-07-11 12:59:27.373    274
16278        6        2018-07-11 12:59:27.373    2018-07-11 13:00:00.000    33
16278        6        2018-07-11 13:00:00.000    2018-07-11 13:02:25.813    145
16278        1        2018-07-11 13:00:00.000    2018-07-11 13:30:00.000    1800
16278        3        2018-07-11 13:02:25.813    2018-07-11 13:02:49.173    24
16278        4        2018-07-11 13:02:49.173    2018-07-11 13:02:51.490    2
16278        5        2018-07-11 13:02:51.490    2018-07-11 13:05:30.453    159
16278        3        2018-07-11 13:05:30.453    2018-07-11 13:05:30.453    0
16278        4        2018-07-11 13:05:30.453    2018-07-11 13:05:33.183    3
16278        5        2018-07-11 13:05:33.183    2018-07-11 13:15:55.777    622
16278        6        2018-07-11 13:15:55.777    2018-07-11 13:16:18.970    23
16278        2        2018-07-11 13:16:18.970    2018-07-11 13:23:32.787    434
16278        3        2018-07-11 13:23:32.787    2018-07-11 13:28:12.907    280
16278        4        2018-07-11 13:28:12.907    2018-07-11 13:28:16.073    4
16278        5        2018-07-11 13:28:16.073    2018-07-11 13:30:00.000    104
16278        5        2018-07-11 13:30:00.000    2018-07-11 13:32:47.177    167
16278        1        2018-07-11 13:30:00.000    2018-07-11 14:00:00.000    1800
16278        6        2018-07-11 13:32:47.177    2018-07-11 13:37:45.500    298
16278        3        2018-07-11 13:37:45.500    2018-07-11 13:43:59.183    374
16278        4        2018-07-11 13:43:59.183    2018-07-11 13:44:01.507    2
16278        5        2018-07-11 13:44:01.507    2018-07-11 13:50:04.983    363
16278        6        2018-07-11 13:50:04.983    2018-07-11 13:50:43.860    39
16278        3        2018-07-11 13:50:43.860    2018-07-11 13:57:21.817    398
16278        4        2018-07-11 13:57:21.817    2018-07-11 13:57:24.177    3
16278        5        2018-07-11 13:57:24.177    2018-07-11 14:00:00.000    156
16278        5        2018-07-11 14:00:00.000    2018-07-11 14:07:57.677    477
16278        1        2018-07-11 14:00:00.000    2018-07-11 14:30:00.000    1800
16278        6        2018-07-11 14:07:57.677    2018-07-11 14:14:08.553    371
16278        3        2018-07-11 14:14:08.553    2018-07-11 14:28:57.117    889
16278        4        2018-07-11 14:28:57.117    2018-07-11 14:28:59.440    2
16278        5        2018-07-11 14:28:59.440    2018-07-11 14:30:00.000    61
16278        5        2018-07-11 14:30:00.000    2018-07-11 14:31:50.793    110
16278        1        2018-07-11 14:30:00.000    2018-07-11 15:00:00.000    1800
16278        6        2018-07-11 14:31:50.793    2018-07-11 14:33:08.727    78
16278        3        2018-07-11 14:33:08.727    2018-07-11 14:38:30.820    322
16278        2        2018-07-11 14:38:30.820    2018-07-11 14:44:22.197    352
16278        2        2018-07-11 14:44:22.197    2018-07-11 15:00:00.000    938
16278        2        2018-07-11 15:00:00.000    2018-07-11 15:01:45.453    105
16278        1        2018-07-11 15:00:00.000    2018-07-11 15:30:00.000    1800
16278        3        2018-07-11 15:01:45.453    2018-07-11 15:13:38.823    713
16278        4        2018-07-11 15:13:38.823    2018-07-11 15:13:42.247    4
16278        5        2018-07-11 15:13:42.247    2018-07-11 15:18:57.147    315
16278        6        2018-07-11 15:18:57.147    2018-07-11 15:19:12.297    15
16278        3        2018-07-11 15:19:12.297    2018-07-11 15:29:43.060    631
16278        4        2018-07-11 15:29:43.060    2018-07-11 15:29:46.160    3
16278        5        2018-07-11 15:29:46.160    2018-07-11 15:30:00.000    14
16278        5        2018-07-11 15:30:00.000    2018-07-11 15:30:37.130    37
16278        1        2018-07-11 15:30:00.000    2018-07-11 16:00:00.000    1800
16278        6        2018-07-11 15:30:37.130    2018-07-11 15:30:44.783    7
16278        3        2018-07-11 15:30:44.783    2018-07-11 15:37:46.373    422
16278        4        2018-07-11 15:37:46.373    2018-07-11 15:37:49.080    3
16278        5        2018-07-11 15:37:49.080    2018-07-11 15:43:52.273    363
16278        6        2018-07-11 15:43:52.273    2018-07-11 15:48:54.730    302
16278        3        2018-07-11 15:48:54.730    2018-07-11 15:56:47.407    473
16278        4        2018-07-11 15:56:47.407    2018-07-11 15:56:49.820    2
16278        5        2018-07-11 15:56:49.820    2018-07-11 16:00:00.000    191
16278        5        2018-07-11 16:00:00.000    2018-07-11 16:01:40.780    100
16278        1        2018-07-11 16:00:00.000    2018-07-11 16:30:00.000    1800
16278        6        2018-07-11 16:01:40.780    2018-07-11 16:04:02.403    142
16278        3        2018-07-11 16:04:02.403    2018-07-11 16:20:53.963    1011
16278        4        2018-07-11 16:20:53.963    2018-07-11 16:21:00.817    7
16278        3        2018-07-11 16:21:00.817    2018-07-11 16:30:00.000    540
16278        3        2018-07-11 16:30:00.000    2018-07-11 16:35:54.190    354
16278        1        2018-07-11 16:30:00.000    2018-07-11 17:00:00.000    1800
16278        4        2018-07-11 16:35:54.190    2018-07-11 16:35:56.473    2
16278        5        2018-07-11 16:35:56.473    2018-07-11 16:38:37.587    161
16278        6        2018-07-11 16:38:37.587    2018-07-11 16:45:29.563    412
16278        3        2018-07-11 16:45:29.563    2018-07-11 16:57:20.893    711
16278        4        2018-07-11 16:57:20.893    2018-07-11 16:57:24.000    4
16278        5        2018-07-11 16:57:24.000    2018-07-11 17:00:00.000    156
16278        5        2018-07-11 17:00:00.000    2018-07-11 17:10:22.210    622
16278        1        2018-07-11 17:00:00.000    2018-07-11 17:15:55.173    955
16278        6        2018-07-11 17:10:22.210    2018-07-11 17:15:55.173    333
16278        7        2018-07-11 17:15:55.173    2018-07-11 17:15:55.173    0
-2
задан Kelly Baptista 19 January 2019 в 02:57
поделиться

3 ответа

Использовать понимание списка:

a = ((5,), (2,0), (1,1))

b = [(a[1][0] + i*a[2][0], a[1][1] + i*a[2][1]) for i in range(a[0][0])]
0
ответ дан Jan Christoph Terasa 19 January 2019 в 02:57
поделиться
def summ(a, b):
    return a[0] + b[0], a[1] + b[1]


x = 5, (2, 0), (1, 1)


def position(x):
    i = 1
    new_list = [x[i]]

    while i < x[0]:
        new_list += summ(new_list[i - 1], x[2]),
        i = i + 1

    return new_list


print(position(x))

Протестировано, и ВЫВОД является

[(2, 0), (3, 1), (4, 2), (5, 3), (6, 4)] [112 ]

0
ответ дан Hassan Voyeau 19 January 2019 в 02:57
поделиться

Давайте возьмем мудрый совет @ StephenRauch и переместим:

new_list = start, summ(start, direction)

за пределы цикла for. И очистим код, как мы делаем:

def summ(a, b):
    return a[0] + b[0], a[1] + b[1]

def position(argument):

    maxx, start, direction = argument

    new_list = [start]

    for _ in range(maxx - len(new_list)):
        new_list.append(summ(new_list[-1], direction))

    return tuple(new_list)

print(position(((5), (2, 0), (1, 1))))

OUTPUT

> python3 test.py
((2, 0), (3, 1), (4, 2), (5, 3), (6, 4))
>

Теперь давайте немного повеселимся с кодом, а не изобретаем векторную арифметику мы импортируем Vec2D из черепахи Python. И верните list, который имеет для меня больше смысла, чем tuple:

from turtle import Vec2D

def position(argument):

    maxx, start, direction = argument

    return [start + n * direction for n in range(maxx)]

print(position(((5), Vec2D(2, 0), Vec2D(1, 1))))

ВЫХОД

> python3 test2.py
[(2.00,0.00), (3.00,1.00), (4.00,2.00), (5.00,3.00), (6.00,4.00)]
> 
0
ответ дан cdlane 19 January 2019 в 02:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: