【问题标题】:Optimization: How to get TimeId from time for each minute in a week?优化:如何从一周内每一分钟的时间获取TimeId?
【发布时间】:2016-04-28 21:21:27
【问题描述】:

我正在创建一个包含 2 列的表:

  1. Day_time(时间从1978-01-01 00:00:00周日到1978-01-07 23:59:00.0周六,粒度:分钟)
  2. Time_id(每分钟的唯一 id),待填充

我填充了第一列。我想填充第二列。

我现在是怎么做的:

EXTRACT(dayofweek FROM day_time) * 10000 + DATEDIFF('minutes', TRUNC(day_time), day_time)

我基本上想要一个函数,我可以传递任何日期,它会告诉我一周内我在哪里。 所以,我需要一个函数,就像上面的函数一样。只是更加优化,我在其中给出一个日期并获得一个唯一的 ID。唯一 ID 应每周重复一次。

示例:Jan 1, 2015 00:00:00 的 ID 将与 Jan 8, 2015 00:00:00 相同。

Why 1978-01-01? cuz it starts from a Sunday.    
Why 10,000? cuz the number of minutes in a day are in four digits.

【问题讨论】:

  • @wingedpanther,感谢士兵的回复。对不起,我不清楚。我想要一个像我写的那样的函数,因为我也想即时计算相同的 Id。我知道递归 CTE 的兄弟,我不需要 CTE 来生成唯一密钥,我可以只是身份。我是对的,还是对的?
  • Amazon Redshift 是否支持任何以下 PostgreSQL 功能:CTE、递归 CTE、序列、generate_series()?
  • 试试这个insert into tbl select row_number() over() id,dtm from( select generate_series('1978-01-01 00:00:00'::timestamp,'1978-01-02 23:59:00.0'::timestamp,'1min'::interval) dtm )t...最初我只是误解了你的要求。
  • 错误:function generate_series(timestamp without time zone, timestamp without time zone, interval) does not exist;generate_series(1,30) 工作正常。我是新手,你能看到这个吗:stackoverflow.com/questions/17282276/…
  • This是……

标签: sql postgresql query-optimization amazon-redshift


【解决方案1】:

您可以一举搞定,无需单独提取日期:

SELECT DATEDIFF('minutes', date_trunc('week',day_time), day_time) 我预计会稍微快一些。

另一种我希望明显更快的方法是将时间戳转换为纪元,除以 60 以从纪元获取分钟,然后取值模数 10,080(一周内 60 * 24 * 7 分钟) .

SELECT (extract(epoch from day_time) / 60) % 10080

如果你不关心每周索引的大小,你也可以这样做:

SELECT (extract(epoch from day_time)) % 604800 并完全跳过除法步骤,这应该会更快。

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 2023-03-22
    • 1970-01-01
    • 2020-10-21
    • 2018-06-02
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多