SQL 查询ClickHouse:按值之间的时间差异小于 X 的位置分组

问题描述

我需要一些关于 sql-query 的帮助。我正在使用 clickhouse,但也许标准 sql 语法足以完成这项任务。

我有下表:

Example_1Example2Example_3
Example_1_1Example2_2Example_3_3

我想在这个例子的最后有什么 - 2行:

SELECT arrayStringConcat(groupArray(Text))
FROM (SELECT event_time,Text,ID
      FROM Test_Table
      ORDER by event_time asc)
GROUP BY ID;

基于 ID 的文本字段的串联。这个 ID 在某个时间间隔内不是唯一的问题。作为一个例子,它只有一分钟是独一无二的。所以我只想连接第一行和最后一行之间的差异小于一分钟的字符串。

现在我有一个查询

import controlP5.*;
import java.util.*;


ControlP5 cp5;

void setup() {
  size(400,400);
  cp5 = new ControlP5(this);
  List l = Arrays.asList("a","b","c","d","e","f","g","h");
  /* add a ScrollableList,by default it behaves like a DropdownList */
  cp5.addScrollableList("dropdown")
     .setPosition(100,100)
     .setSize(200,100)
     .setBarHeight(20)
     .setItemHeight(20)
     .addItems(l)
     // .setType(ScrollableList.LIST) // currently supported DROPDOWN and LIST
     ;
     
     
}

void draw() {
  background(240);
}

我应该在这里添加什么样的条件?

解决方法

这是一个例子

create table X(event_time DateTime,Text String,ID Int64) Engine=Memory;
insert into X values ('2021-03-16 09:00:48','Example_1',1),('2021-03-16 09:00:49','Example_2',('2021-03-16 09:00:50','Example_3',('2021-03-16 09:01:48','Example_4',('2021-03-16 09:01:49','Example_5',('2021-03-16 09:15:48','Example_1_1',('2021-03-16 09:15:49','Example_2_2',('2021-03-16 09:15:50','Example_3_3',1);

SELECT * FROM X

┌──────────event_time─┬─Text────────┬─ID─┐
│ 2021-03-16 09:00:48 │ Example_1   │  1 │
│ 2021-03-16 09:00:49 │ Example_2   │  1 │
│ 2021-03-16 09:00:50 │ Example_3   │  1 │
│ 2021-03-16 09:01:48 │ Example_4   │  1 │
│ 2021-03-16 09:01:49 │ Example_5   │  1 │
│ 2021-03-16 09:15:48 │ Example_1_1 │  1 │
│ 2021-03-16 09:15:49 │ Example_2_2 │  1 │
│ 2021-03-16 09:15:50 │ Example_3_3 │  1 │
└─────────────────────┴─────────────┴────┘

在这种情况下预期的结果是什么?

CH 21.3

set allow_experimental_window_functions = 1;

SELECT
    ID,y,groupArray(event_time),groupArray(Text)
FROM
(
    SELECT
        ID,event_time,Text,max(event_time) OVER (PARTITION BY ID ORDER BY event_time ASC RANGE BETWEEN CURRENT ROW AND 60 FOLLOWING) AS y
    FROM X
)
GROUP BY
    ID,y
ORDER BY
    ID ASC,y ASC

Query id: 9219a1f2-8c96-425f-9301-745fa7b88b40

┌─ID─┬───────────────────y─┬─groupArray(event_time)────────────────────────────────────────────────────────────────────┬─groupArray(Text)──────────────────────────────────┐
│  1 │ 2021-03-16 09:01:48 │ ['2021-03-16 09:00:48']                                                                   │ ['Example_1']                                     │
│  1 │ 2021-03-16 09:01:49 │ ['2021-03-16 09:00:49','2021-03-16 09:00:50','2021-03-16 09:01:48','2021-03-16 09:01:49'] │ ['Example_2','Example_5'] │
│  1 │ 2021-03-16 09:15:50 │ ['2021-03-16 09:15:48','2021-03-16 09:15:49','2021-03-16 09:15:50']                       │ ['Example_1_1','Example_3_3']       │
└────┴─────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────┘