栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在MM-DD上汇总来自多年的数据,而忽略年份

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在MM-DD上汇总来自多年的数据,而忽略年份

基本上,

to_char(time, 'MMDD')
像您已经尝试过的那样,完成年度工作就可以了。您只是忘记了
将它应用于加入
generate_series()
之前 生成的时间戳。以及其他一些小细节。

为了简化并提高性能和方便性,我建议使用此简单函数根据

integer
给定的模式“ MMDD”来计算
timestamp

CREATE FUNCTION f_mmdd(date) RETURNS int LANGUAGE sql IMMUTABLE AS'SELECt (EXTRACT(month FROM $1) * 100 + EXTRACT(day FROM $1))::int';

to_char(time, 'MMDD')
刚开始使用,但是切换到上面的表达式,结果证明在各种测试中速度最快。

db
<>在这里拨弄

由于已定义,因此可以在表达式索引中使用

IMMUTABLE
。并且它仍然允许函数内联,因为它仅使用
EXTRACT(xyz FROM date)
-通过内部
IMMUTABLE
函数实现
date_part(text,date)
。(请注意,
datepart(text, timestamptz)
只是
STABLE
)。

然后,这种查询就可以完成工作:

SELECt d.mmdd, COALESCE(ct.ct, 0) AS total_countFROM  (   SELECt f_mmdd(d::date) AS mmdd  -- ignoring the year   FROM   generate_series(timestamp '2018-01-01'  -- any dummy year  , timestamp '2018-12-31'  , interval '1 day') d   ) dLEFT  JOIN (   SELECt f_mmdd(time::date) AS mmdd, count(*) AS ct   FROM   counties c   JOIN   ltg_data d ON ST_contains(c.the_geom, d.ltg_geom)   WHERe  cwa = 'MFR'   GROUP  BY 1   ) ct USING (mmdd)ORDER  BY 1;

由于

time
(我将使用其他列名)是数据类型,
timestamptz
因此强制类型转换
time::date
取决于当前会话的时区设置。(“天”由您所在的时区定义。)要获得不可变(但较慢)的结果,请使用
ATTIME ZONE
具有时区 名称 的结构,例如:

SELECt f_mmdd((time AT TIME ZONE 'Europe/Vienna')::date) ...

格式化

mmdd
任何您喜欢的显示方式。

integer
对于此特定查询,强制转换为可选。但是,由于您打算进行各种查询,因此最终需要在表达式上添加索引:

CREATE INDEX ltg_data_mmdd_idx ON event(f_mmdd(time));

查询不需要。)

integer
为此目的要快一些。
并且您需要(否则是可选的)函数包装,因为
to_char()
它只是被定义的
STABLE
,但是我们需要
IMMUTABLE
索引。
更新的表达式
(EXTRACT(monthFROM $1) * 100 + EXTRACT(day FROM $1))::int
IMMUTABLE
,但是函数包装器仍然很方便。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390456.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号