-
PGSQL提取本月跨越的周数及每周的开始结束日期
- 网站名称:PGSQL提取本月跨越的周数及每周的开始结束日期
- 网站分类:技术文章
- 收录时间:2025-06-08 15:53
- 网站地址:
“PGSQL提取本月跨越的周数及每周的开始结束日期” 网站介绍
最近一个比较奇葩的需求,针对数据分析方面,需要针对月度跨的所有周数来进行分析,即使不是一个整周,也按照整周去进行提取.
例如: 2024年9月份,跨越了6周, 第一周和最后一周,只有1天.但是统计的时候需要将对应的数据处理出来.然后进行分析.这样就需要先将本月的周数处理一下,才可以与业务数据进行关联提取.
pgsql数据库的具体代码如下:
-- 获取录入月份的月开始和结束日期
WITH input_month AS (
SELECT
DATE_TRUNC('month', '2024-07-01'::DATE) AS month_start,
DATE_TRUNC('month', '2024-07-01'::DATE) + INTERVAL '1 month - 1 day' AS month_end
),
-- 获取提取月份,每日对应的周的开始和结束日期,包含跨越.
weekly_boundaries AS (
SELECT
date_trunc('week', day)::date AS week_start, -- 周一作为周的开始
(date_trunc('week', day) + INTERVAL '6 days')::date AS week_end -- 周日作为周的结束
FROM generate_series(
date_trunc('month', (select month_start from input_month)::DATE), -- 当月第一天
date_trunc('month', (select month_end from input_month)::DATE) + INTERVAL '1 month' - INTERVAL '1 day', -- 下个月第一天减一天,即当月最后一天
INTERVAL '1 day'
) AS day
),
-- 处理第一周和最后一周的数据.
adjusted_weeks AS (
SELECT
CASE
WHEN week_end > (SELECT month_end FROM input_month) THEN (SELECT month_end FROM input_month) ELSE week_end
END AS adjusted_week_end, -- 当结束日期大于本月最后一天.那么提取本月最后一天.
CASE
when week_start < (SELECT month_start FROM input_month) then (SELECT month_start FROM input_month) else week_start
END AS adjusted_week_start -- 当开始日期小于本月第一天,那么提取本月第一天.
FROM
weekly_boundaries
group by week_start, week_end
)
-- 提取周数据.
SELECT
ROW_NUMBER() over (order by adjusted_week_start) as in_week, --所属本月周数
EXTRACT(day from adjusted_week_start) as start_day, --周的开始日期,单位: 日
EXTRACT(day from adjusted_week_end) as end_day, -- 周的结束日期, 单位: 日
EXTRACT(day from adjusted_week_end)-EXTRACT(day from adjusted_week_start)+1 as days_num -- 本周的天数
FROM
adjusted_weeks
ORDER BY
adjusted_week_start;
代码解析: 首先创建CTE,以供缓存使用.
input_month: 获取录入日期对应的月份的第一天和最后一天
weekly_boundaries: 获取提取月份,每日对应的周的开始和结束日期,包含跨月.
adjusted_weeks: 处理第一周和最后一周的数据.
然后通过,提取周数据.首先通过开始日期进行排序,然后通过ROW_NUMBER(),生成序号,以便提取属于第几周. 为方便后续提取.将每日的数据都抽取出日来与订单的日进行关联提取即可.
其中: inweek: 所属周数, start_day: 开始日, end_day: 结束日, days_num: 周在本月的天数
为方便后续确认天数,增加了本月每周的天数,以便确认销量等数据是否合理.
更多相关网站
- 云服务器:SQL数据库超时的原因与解决方法
- 一个时间戳精度问题,引发了一个MySQL血案
- (二十二) 程序员必备: 10秒到0.1秒,亿级数据下MySQL慢查询分析教程
- MySQL各种SQL的执行频率
- '0000-00-00'日期可以存入MySQL吗
- 【SQL】SQL 语法差异大全(PgSQL/MySQL/Oracle/TiDB/OceanBase)
- 了解SQL吗
- SQL用了两年多,分享2个最常用的小技巧
- 从Sql角度,对比学习Python数据处理包pandas
- SqlServer根据身份证号码查询出生日期和年龄
- 吊打面试官(十一)--Java语言中日期处理相关问题总结
- 玩转MySQL的时间类型:Date、DateTime、TimeStamp、Time
- 多表关联查询的性能优化技巧:预关联
- SQL学习:SQL同比分析案例讲解,一看就懂
- java.util.Date、java.sql.Date、java.sql.Timestamp区别和总结
- 疯传!Java 日期时间底层逻辑大揭秘,看完直接拿捏面试官挖的坑!
- 记一次有意思的 SQL 实现 → 分组后取每组的第一条记录
- 全量跑1小时 vs 增量抽1分钟!选对时间戳&主键增量的ETL方法更省时
- 最近发表
-
- 联想推出 IdeaPad 14s / 15s:均为 3399 元,运行 Win11 系统
- 顶配版ThinkPad X1 Carbon评测
- 联想ThinkPad X1 Carbon评测
- lenovo联想 拯救者-14 加装ssd、内存及win10转移到ssd经验谈
- 联想发布新款耳机鼠标等配件:专为ThinkPad X1设计
- 杜比全景音体验,联想K4 Note在印度正式发布
- 3099 元起,联想推出 IdeaPad 15:约10小时续航,预装 Win11系统
- 联想拯救者Y70、小新Pad Pro 2022发布丨拯救者Y70测评体验
- 千元可定制!联想K4 Note印度发布:杜比全景音体验
- 声临其境 联想TAB2 A10平板联手杜比
- 标签列表
-
- serv-u 破解版 (6)
- 极域电子教室2009 (6)
- 6300主题下载 (1)
- oracle11204下载 (1)
- c++论坛 (14)
- huaweiupdateextractor (4)
- thinkphp6下载 (7)
- 前端论坛 (11)
- mysql 时间索引 (13)
- mydisktest_v298 (35)
- unlocker208 (1)
- sql 日期比较 (33)
- document.appendchild (35)
- 头像打包下载 (35)
- 二调符号库 (23)
- oppoa5专用解锁工具包 (8)
- acmecadconverter_8.52绿色版 (25)
- oracle timestamp比较大小 (7)
- chm editor破解版 (7)
- throttlestop防止降频 (9)
- f12019破解 (16)
- 流星蝴蝶剑修改器 (18)
- pygame中文手册 (2)
- 联想杜比音效驱动下载 (10)