В этом примере таблица чисел используется для получения ваших интервалов. Это быстрый и грязный бит кода и не предполагает, что у вас есть таблица существующих номеров. Для этого примера ваши образцы данных были загружены в глобальную временную таблицу с именем ## 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
Использовать понимание списка:
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])]
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 ]
Давайте возьмем мудрый совет @ 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)]
>