SQL范围介于过去日期和无界前导日期之间
表结构如下所示SQL范围介于过去日期和无界前导日期之间,sql,oracle,range,window-functions,Sql,Oracle,Range,Window Functions,表结构如下所示 country_id | ID | date | same_week_count 我对周数感兴趣,所以我在最终输出中提取它 我想计算一下,在这周之前,我在每个国家使用的ID出现了多少次 count(ID) OVER (PARTITION BY country_id, ID ORDER BY to_number(date, 'IW') RANGE UNBOUNDED PRECEDING) as ttl_count 但我得到了以下信息: country_id | ID
country_id | ID | date | same_week_count
我对周数感兴趣,所以我在最终输出中提取它
我想计算一下,在这周之前,我在每个国家使用的ID出现了多少次
count(ID) OVER (PARTITION BY country_id, ID ORDER BY to_number(date, 'IW') RANGE UNBOUNDED PRECEDING) as ttl_count
但我得到了以下信息:
country_id | ID | date | same_week_count | ttl_count
------------------------------------------------------------
1 | 123 | 35 | 2 | 1
1 | 123 | 35 | 2 | 3
3是从哪里来的?无界跟随是否包括本周?我是否应该有一个类似于
介于到之间的范围(日期,'IW')-1前置和无界前置的表达式
?当您编写范围无界前置
时,它是无界前置和当前行之间的范围的快捷语法
因此,您的前一个无限制范围
确实包括当前周数。给定行的计数将包括与行本身具有相同或更少周数的所有行(分区内),即使这些行实际上位于行本身之后。这是
之间的范围的定义-否则
之间的行可能是另一种选择
但是,当您想要计算每个分区中周数小于相同周数的行数时,您需要使用类似于介于无界前一行和1个前一行之间的范围,它将包括小于或等于当前行的周数
另一个问题是当你跨过一年时会发生什么?这是否意味着仅用于一个日历年内的数据?在2015年第3周,您是否希望包含2014年第51周的数据?如果是,请注意您的TO_NUMBER
表达式-最好执行TRUNC(date,'IW')
,如下所示:
count(ID) OVER (
PARTITION BY country_id, ID
ORDER BY trunc(date, 'IW')
RANGE BETWEEN UNBOUNDED PRECEDING AND 7 PRECEDING
) as ttl_count
TRUNC
使日期成为每周的星期一<代码>前7天
则是前7天。感谢您的详细回答!这正是我要找的!