clickhouse:如何在另一列中找到高于日期的数组中的最小日期?
Posted
技术标签:
【中文标题】clickhouse:如何在另一列中找到高于日期的数组中的最小日期?【英文标题】:clickhouse: How do I find the least date in array that is above date in another column? 【发布时间】:2020-05-23 13:59:31 【问题描述】:基本上我的表具有以下数据结构:
id_level1
: Int32
id_level2
: Int32
event_date
:日期
arr_object_ids
: Int32 数组 - 按下一列排序
arr_object_dates
: 日期数组 - 升序排序
我需要的是对于每对(id_leve1, id_level2)
,至少有一个高于event_date
的object_date
。 Clickhouse 怎么可能?
那我就用arrayElement(arr_object_ids, indexOf(arr_object_dates, solution)
来获取对应的object_id
【问题讨论】:
【参考方案1】:试试这个查询:
SELECT
id_level1,
id_level2,
/*arrayFirst(x -> x > event_date, arr_object_dates) least_date,*/
arrayFirstIndex(x -> x > event_date, arr_object_dates) least_date_index,
least_date_index = 0 ? -1 : arrayElement(arr_object_ids, least_date_index) object_id /* -1 if result not found */
FROM (
/* emulate original table */
SELECT 1 id_level1, 2 id_level2, '2020-01-03' event_date,
[4, 5, 6,7] arr_object_ids,
['2020-01-01', '2020-01-03', '2020-01-06', '2020-01-11'] arr_object_dates
UNION ALL
SELECT 3 id_level1, 4 id_level2, '2020-05-03' event_date,
[4, 5, 6,7] arr_object_ids,
['2020-01-01', '2020-01-03', '2020-01-06', '2020-01-11'] arr_object_dates)
ORDER BY event_date
/* result
┌─id_level1─┬─id_level2─┬─least_date_index─┬─object_id─┐
│ 1 │ 2 │ 3 │ 6 │
│ 3 │ 4 │ 0 │ -1 │
└───────────┴───────────┴──────────────────┴───────────┘
*/
【讨论】:
以上是关于clickhouse:如何在另一列中找到高于日期的数组中的最小日期?的主要内容,如果未能解决你的问题,请参考以下文章