我有一个这样的数据集:
我们确实可以使用月份开始的日历表来解决这个问题,例如calendar(date)
。
我们可以在聚合子查询中定义每个帐户的日期范围,然后用日历表cross join
它;这给了我们所有可能的日期/帐户元组。剩下要做的就是尝试将相应的行(如果有的话)带left join
。
select c.date, a.account, coalesce(t.spend, 0) spend
from (
select account, min(date) min_date, max(date) max_date
from mytable
group by account
) a
inner join calendar c on c.date >= a.min_date and c.date <= a.max_date
left join mytable t on t.date = c.date and t.account = a.account
步骤和方法:
-
首先需要使用
first_value
函数查找每个组的最大和最小日期 -
您需要一个包含唯一月份和所有唯一帐户的数据集-这就是
cross join
的由来。您可以相应地调整表的名称 -
您需要将max_date和min_date值连接到每个帐户值,这需要过滤掉min_date超出实际数据集范围的行,就像您描述的日期2/1/21的帐户B的情况一样。要实现这一点,您只需要在键
上进行连接accounts = accounts
-
然后您需要根据日期和帐户(即
m2
)加入,以获得基于日期和帐户的消费值 -
最后,您可以过滤掉在
中给定帐户的原始日期的最大值之后和最小值之前出现的行where
子句
with main as (
select
date,
account,
coalesce(spend,0) as total_spend,
first_value(Date) over(partition by account order by date desc) as max_date,
first_value(Date) over(partition by account order by date) as min_date
from <table_name>
),
combining as (
-- make sure you have distinct accounts and months stored in these tables
select distinct accounts from <account_name_table>
cross join <calendar_month_table>
),
joining as (
select
c.date,
c.accounts,
coalesce(m2.total_spend,0) as new_spend,
main.max_date,
main.min_date
from combining
left join main
on combining.accounts = main.accounts
left join main as m2
on combining.accounts = m2.accounts
and combining.date = m2.date
)
select * from joining where min_date <= date and max_date >= date
相关内容
- 处理特定于业务实体的日期时间的最佳方式是什么,而不考虑用户在 Flutter 中的本地时间?
- 在 C# 中使用相对于用户本地时区的日期时间的最佳做法
- 对象结构的最佳数组,根据特定日期范围内相似的键值求和
- SQL Server:日期操作的最佳实践查询
- 按大小和日期轮换MySQL错误日志的最佳方式
- 数据库中存储日期时间的最佳实践是什么?
- 处理r中错误日期的最佳方法
- 在Ruby中比较两个文件日期的最佳方法是什么?
- 在SQL中对多个日期范围的数据求和的最佳方法是什么?
- 在给定时区中比较给定日期与当前日期的最佳方法,不包含时间部分
- 将日期列表转换为DateFrom/DateTo范围的最佳方法
- 在 Javascript 中,将字符串化日期转换为'YYYY.MM.DD'格式的最佳实践是什么?
- 在 (我的)SQL 中存储不重叠日期范围的最佳方法是什么?
- 从两个日期不同的文件夹中读取所有CSV文件的最佳方式(LOOP)
- 编写"GET"API 端点以接收可能为空的日期对象的最佳方法 [C#]
- 在pyspark中转换或处理日期数据类型的最佳方法是什么?
- SQL如何根据另一个表中的日期最佳地查询一个表的两个日期窗口
- 集<LocalDate>包含本地日期最佳做法
- 获取多个前行数据,其中维度相同且 python 中没有跳过日期?(最佳性能)
- 比较数字日期 最佳12 与日期 9
最新更新
- 正在文本文件中搜索字符串,但得到多个结果
- 如何在链表中使用复制赋值操作符
- CycloneDX v2.1.2 -如何使用CycloneDX v2.1.2为.net框架项目生成依赖关系图
- 如何对一般嵌套的TypedDict进行类型注释?
- Web代码只是不工作-文本不断弹出动画后
- 如何使用VBA根据电子邮件的主题提取Outlook电子邮件数据?
- 为什么 H2 不能创建此表?
- 按下按钮后功能并行或同时计算
- Gradle无法获取Unity Mediation、Firebase和Google Play Service的依赖项.&
- 使用两个表在mysql数据库中按国家查找用户
- 如何从appsettings.json获得日期时间?
- 配置组到springdoc openapi
- 用连字符替换laravel路由URL模式中的正斜杠
- 获胜团队(班级)场景
- 可以解构来自SWR查询的结果吗?
- 如何添加已配置的GKE节点池访问范围
- Tomcat 10.1 尝试加载自定义标记,但找不到类"javax.servlet.jsp.tagext.Tag"
- 如何根据RFC 3984从RTP包中提取H264视频?
- getElementsByTagName递归地在具有iFrames的页面上
- 我的文本字段返回 null,因此不知何故该值没有从 onChanged ->变量传递
- 在redis中,HSET是否影响哈希上现有的TTL ?
- 如何获得h3标签下的特定链接?
- c -当我用数组排队时重复
- 为我的GET API调用防止不需要的参数值,以提高安全性
- 我如何使用TypeScript泛型函数,可以返回对象或数组?
- 我正在做一个机器学习NLP项目,遇到了一个问题
- 更正我的批处理脚本,以便文件夹中的文件可以根据年,月和日分组
- 运行我的 CI 时没有这样的模块"AWSCore",在本地很好
- APPSCRIPT从Gmail中检索带有电子邮件地址的上次交互日期
- Arduino cmake build system without IDE
热门标签:
javascript python java c# php android html jquery c++ css ios sql mysql arrays asp.net json python-3.x ruby-on-rails .net sql-server django objective-c excel regex ruby linux ajax iphone xml vba spring asp.net-mvc database wordpress string postgresql wpf windows xcode bash git oracle list vb.net multithreading eclipse algorithm macos powershell visual-studio image forms numpy scala function api selenium