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_dateobject_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:如何在另一列中找到高于日期的数组中的最小日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一列中显示最大日期金额?

在另一列满足条件后计算一列中的值

TSQL - 如何在另一列中提取具有最小值和最大值的列

如何在 Hive SQL 中对一列中的数据进行分组并将其分布在另一列中?

EXCEL 比较一列数据是不是在另一列出现过

SQL:在一个列中查找在另一列中也不唯一的非唯一记录