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天。

感谢您的详细回答!这正是我要找的!