如何返回每个月的最后一天并筛选视图中每月最后一条记录?
嘿,我明白你的困扰了——first()和last()这类表计算默认是基于整个视图的列来计算,不会自动按月份分组对吧?下面我给你两种场景的解决方案,不管你是做可视化视图还是用数据库取数都能搞定:
一、筛选每个月的最后一条记录
如果是用Tableau创建视图:
- 第一步:先把日期字段转换成月份维度,创建计算字段:
月份 = DATETRUNC('month', [你的日期字段]) - 第二步:创建判断是否为当月最后一条的计算字段,这里要利用表计算的分区功能:
是否为当月最后一条 = LAST() = 0 - 第三步:把这个计算字段拖到「筛选器」里,选择
True;然后右键点击这个字段,进入「编辑表计算」,设置分区依据为「月份」,寻址依据为「你的日期字段」(按降序排序),这样LAST()就会在每个月的范围内找最后一条记录了。
如果是用SQL查询数据:
用窗口函数ROW_NUMBER()按月份分区,按日期降序排序,然后取行号为1的记录就行:
WITH monthly_data AS ( SELECT *, -- 按月份分组,同组内按日期倒序排,第一条就是当月最后一条 ROW_NUMBER() OVER ( PARTITION BY DATE_TRUNC('month', date_column) ORDER BY date_column DESC ) AS row_num FROM your_table_name ) SELECT * FROM monthly_data WHERE row_num = 1;
二、获取每个月的最后一天
Tableau里的计算方法:
直接用内置函数或者日期运算都可以:
- 方法一(推荐,Tableau 2020.2+支持):
当月最后一天 = EOMONTH([你的日期字段]) - 方法二(兼容旧版本):
当月最后一天 = DATEADD('day', -1, DATETRUNC('month', [你的日期字段]) + INTERVAL '1 month')
SQL里的计算方法:
不同数据库有对应的快捷函数,通用写法和专属函数都给你列出来:
- 通用写法(适配大部分数据库):
DATE_TRUNC('month', date_column) + INTERVAL '1 month' - INTERVAL '1 day' AS month_last_day - 专属函数更简洁:
- MySQL:
LAST_DAY(date_column) - SQL Server:
EOMONTH(date_column) - PostgreSQL:
(DATE_TRUNC('month', date_column) + INTERVAL '1 month')::date - 1
- MySQL:
内容的提问来源于stack exchange,提问作者Ezzy
相关产品推荐
相关产品推荐

