Я пытаюсь сравнить временной интервал Аллена с временным оператором в q на последнем kdb +.Временной оператор Аллена IntersectsWith представляет собой объединение 11 из 13 операторов реляционной интервальной алгебры, которые он определяет.По сути, он возвращает все перекрывающиеся интервалы плюс любые, которые касаются концов интервала.(В этом смысле он не существует в качестве примитивного временного оператора).
У меня есть таблица, содержащая измерения прибора за интервал (startDate,endDate)
- размер интервала может быть динамическим, но в приведенном ниже примереэто интервалы в одну минуту:
queryPeriods:dataFieldStartDate`dataFieldEndDate!(2019.01.01T00:00:00.000000000; 2019.01.02T00:00:00.000000000)
dataValues:`datafield`startDate`endDate!(`inst1_m`inst1_m`inst1_m;2019.01.01T00:00:00.000000000 2019.01.01T00:01:00.000000000 2019.01.01T00:02:00.000000000; 2019.01.01T00:01:00.000000000 2019.01.01T00:02:00.000000000 2019.01.01T00:03:00.000000000)
queryPeriods
dataFieldStartDate | dataFieldEndDate
----------------------------- -----------------------------
2019.01.01T00:00:00.000000000 | 2019.01.02T00:00:00.000000000
dataValues
datafield | startDate | endDate
--------- ----------------------------- -----------------------------
`inst1_m | 2019.01.01T00:00:00.000000000 | 2019.01.01T00:01:00.000000000
`inst1_m | 2019.01.01T00:01:00.000000000 | 2019.01.01T00:02:00.000000000
`inst1_m | 2019.01.01T00:02:00.000000000 | 2019.01.01T00:03:00.000000000
Я немного знаком с оператором соединения окон wj, но я ни в коем случае не "Бог",и я не уверен, как сделать wj в строке, содержащей интервал.В качестве альтернативы я думал о моделировании интервала с использованием структуры данных Relational Interval Tree и индексировании / вводе ключей на "узле ветвления", но затем я теряю преимущества wj.
Хотяпримерных данных здесь мало, моя цель - в конечном итоге сравнить 20B строк.
РЕДАКТИРОВАТЬ: Вот запрос SQL, который копирует то, что я хочу сделать, плюс вывод запроса.Вы также можете запустить SQL на rextester , но, поскольку он построен с использованием CTE, ему не требуются специальные разрешения для запуска на SQL Server.
;WITH QueryPeriods AS (
SELECT
DataFieldStartDate = CAST('2019.01.01 00:00:00.0000000' AS DATETIME2),
DataFieldEndDate = CAST('2019.01.02 00:00:00.0000000' AS DATETIME2)
), DataValues AS (
SELECT
datafield = 'inst1_m',
startDate = CAST('2019-01-01 00:00:00.0000000' AS DATETIME2),
endDate = CAST('2019.01.01 00:01:00.0000000' AS DATETIME2)
UNION ALL
SELECT
datafield = 'inst1_m',
startDate = CAST('2019.01.01 00:01:00.0000000' AS DATETIME2),
endDate = CAST('2019.01.01 00:02:00.0000000' AS DATETIME2)
UNION ALL
SELECT
datafield = 'inst1_m',
startDate = CAST('2019.01.01 00:02:00.0000000' AS DATETIME2),
endDate = CAST('2019.01.01 00:03:00.0000000' AS DATETIME2)
)
SELECT
qp.*,
dv.*
FROM QueryPeriods qp
LEFT JOIN DataValues dv
ON dv.datafield = 'inst1_m'
AND dv.startDate < qp.DataFieldEndDate AND dv.endDate > qp.DataFieldStartDate
OUTPUT:
DataFieldStartDate DataFieldEndDate datafield startDate endDate
01.01.2019 00:00:00 02.01.2019 00:00:00 inst1_m 01.01.2019 00:00:00
01.01.2019 00:01:00
01.01.2019 00:00:00 02.01.2019 00:00:00 inst1_m 01.01.2019 00:01:00
01.01.2019 00:02:00
01.01.2019 00:00:00 02.01.2019 00:00:00 inst1_m 01.01.2019 00:02:00
01.01.2019 00:03:00