【问题标题】:Clickhouse generating array of dates between two dates and intervalClickhouse 生成两个日期和间隔之间的日期数组
【发布时间】:2021-09-28 11:55:55
【问题描述】:

我最近一直在使用 Clickhouse 提出很多问题,希望有人能将我从这种痛苦中解救出来。

我的数据库中有多个日期,

例如。我的数据库的日期为 5 月 (2020-05-01 ~ 2020-05-31) 的每一天

然后我想设置5月1日和31日作为开始日期和结束日期

并以一定的间隔获取数组中日期的SELECT结果

例如

SELECT (some query about setting 2 timestamps as start / end and interval of 5 days)

那么预期的结果将是

2020-05-01
2020-05-05
2020-05-10
2020-05-15 . . .goes on till 30

我希望这个间隔是月、日、小时、分钟、秒、毫秒

但就我对 clickhouse 的研究而言,我们真的不能在 clickhouse 中使用毫秒吗????

如果是这样,我是否必须将日期转换为 UInt64,然后执行一些间隔技巧以获取结果 UInt64,然后将其转换为 datetime ???

请帮帮我:(

输入数据示例:

start_at
2020-01-14 18:04:36.000
2020-01-14 19:07:48.000
2020-01-14 20:46:48.000
2020-01-14 23:21:12.000
2020-01-15 00:02:00.000
2020-01-15 03:36:00.000
2020-01-15 04:54:24.000
2020-01-15 08:04:00.000
2020-01-15 09:04:00.000
2020-01-15 10:04:00.000
2020-01-15 11:04:00.000
2020-01-15 14:04:00.000
2020-01-15 18:04:00.000
2020-01-16 11:04:00.000
2020-01-16 17:04:00.000
2020-01-16 17:04:00.000
2020-01-17 11:04:00.000
2020-01-17 18:04:00.000
2020-01-17 20:04:00.000
2020-01-18 01:04:00.000
2020-01-18 15:04:00.000

预期结果(以 2 天为例)

    time                        count
2020-01-14 18:04:36.000
2020-01-16 18:04:36.000
2020-01-18 18:04:36.000 

或间隔 1 天

         time                       count
2020-01-14 18:04:36.000
2020-01-15 18:04:36.000
2020-01-16 18:04:36.000
2020-01-17 18:04:36.000
2020-01-18 18:04:36.000

或 12 小时

             time                       count
2020-01-14 18:04:36.000
2020-01-15 06:04:36.000
2020-01-15 18:04:36.000
2020-01-16 06:04:36.000
2020-01-16 18:04:36.000
2020-01-17 06:04:36.000
2020-01-17 18:04:36.000
2020-01-18 06:04:36.000
2020-01-18 18:04:36.000

【问题讨论】:

  • 您能提供一个输入数据和预期结果的小例子吗?
  • @vladimir 你好我添加了它!

标签: clickhouse


【解决方案1】:

试试这个查询:

WITH
    toDateTime64('2020-01-14 18:04:36.000', 3) AS start_from,
    toUnixTimestamp64Milli(start_from) AS start_from_ts,
    ((12 * 60) * 60) * 1000 AS interval_msec
SELECT
  fromUnixTimestamp64Milli(toInt64(ts)) dt,
  count
FROM (    
  SELECT
      start_from_ts + interval_msec * interval_number AS ts,
      floor((toUnixTimestamp64Milli(start_at) - start_from_ts) / interval_msec) AS interval_number,
      count() AS count
  FROM 
  (
    /* emulate the test dataset */
    SELECT toDateTime64(dt, 3) AS start_at
      FROM (
        SELECT arrayJoin([
          ('2020-01-14 18:04:36.000'),
          ('2020-01-14 19:07:48.000'),
          ('2020-01-14 20:46:48.000'),
          ('2020-01-14 23:21:12.000'),
          ('2020-01-15 00:02:00.000'),
          ('2020-01-15 03:36:00.000'),
          ('2020-01-15 04:54:24.000'),
          ('2020-01-15 08:04:00.000'),
          ('2020-01-15 09:04:00.000'),
          ('2020-01-15 10:04:00.000'),
          ('2020-01-15 11:04:00.000'),
          ('2020-01-15 14:04:00.000'),
          ('2020-01-15 18:04:00.000'),
          ('2020-01-16 11:04:00.000'),
          ('2020-01-16 17:04:00.000'),
          ('2020-01-16 17:04:00.000'),
          ('2020-01-17 11:04:00.000'),
          ('2020-01-17 18:04:00.000'),
          ('2020-01-17 20:04:00.000'),
          ('2020-01-18 01:04:00.000'),
          ('2020-01-18 15:04:00.000')]) dt)
    )
  WHERE start_at >= start_from
  GROUP BY interval_number
  ORDER BY ts WITH FILL FROM toUnixTimestamp64Milli(toDateTime64('2020-01-14 18:04:36.000', 3)) TO toUnixTimestamp64Milli(toDateTime64('2020-01-18 18:04:36.000', 3)) STEP ((12 * 60) * 60) * 1000
  )

/* result
┌──────────────────────dt─┬─count─┐
│ 2020-01-14 18:04:36.000 │     7 │
│ 2020-01-15 06:04:36.000 │     6 │
│ 2020-01-15 18:04:36.000 │     0 │
│ 2020-01-16 06:04:36.000 │     3 │
│ 2020-01-16 18:04:36.000 │     0 │
│ 2020-01-17 06:04:36.000 │     2 │
│ 2020-01-17 18:04:36.000 │     2 │
│ 2020-01-18 06:04:36.000 │     1 │
└─────────────────────────┴───────┘
*/

上面的查询计算间隔 12 小时的值。

要将其应用于其他区间需要修改:

【讨论】:

  • DB::Exception: Missing columns: 'interval_msec' 'start_from_ts' 'start_from' while processing query: // 好像我的 clickhouse(版本 20.9.2.20)不能与 'WITH' 合作,但谢谢非常感谢您的帮助,我将研究此查询并尝试通过努力学习来解决它:(非常感谢!结果似乎正是我想要的!
  • 哦,我在第二个 FROM () 中添加了 WITH 值,它有效!谢谢!!!!!!!!!!!!!1
  • @HI,np 我很乐意提供帮助。删除问题stackoverflow.com/questions/68451160/…stackoverflow.com/questions/68463361/… 可能有意义吗?看起来他们已经回答了。
猜你喜欢
  • 2022-01-14
  • 2015-08-06
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多