在子查询结果后检索 52 周

Retrieving 52 weeks after the result of a subquery

从包含销售额的 table 中,我检索了 table 的最后一周。这给了我最后一周进行销售的时间。 'Date' 永远是一个月的第一天,但​​没关系,真正重要的数据是星期和 partial_week。 结果很简单:

+------------+---------+--------------+
|    Date    |  Week   | Partial_week |
+------------+---------+--------------+
| 2020-02-01 | 2020-09 | 2020M02W09   |
+------------+---------+--------------+

我们称它为 t1

我有一个 table 从 2015 年到 2025 年每个月的第一天,每周和部分周 (当一个星期在两个月时,它被分成两个部分星期,它们具有相同的数字但不同的月份)。看起来像这样:

+------------+---------+--------------+
|    Date    |  Week   | Partial_week |
+------------+---------+--------------+
| 2020-02-01 | 2020-05 | 2020M02W05   |
| 2020-02-01 | 2020-06 | 2020M02W06   |
| 2020-02-01 | 2020-07 | 2020M02W07   |
| 2020-02-01 | 2020-08 | 2020M02W08   |
| 2020-02-01 | 2020-09 | 2020M02W09   |
| 2020-03-01 | 2020-09 | 2020M03W09   |
+------------+---------+--------------+

我们称它为 t2

我现在需要检索 t2 中的所有内容,即我在 t1 中检索到的一周后 1 到 52 周之间的所有内容。 (这应该让我每周和部分周到 2021-09 左右)。

我想拥有一个

'select top 52 distinct week from t2'

加入 t1 并有一个 where 子句 'where t1.week < t2.week'

然后再次加入 t2 上的所有内容以获得每个部分周,

但这行不通,因为每周 t1.week 都等于 null(我希望 t1.week 可以只是一个变量,因为它只有一行...)

如有任何想法,我们将不胜感激。

你的逻辑似乎很接近。将初始查询放在标量子查询中以像处理变量一样处理它:

select *
from t2 
where t2.week >=
 ( select week from t1 -- i.e. your existing query to return the latest week 
 )
qualify 
   dense_rank()
   over (order by week) <= 52

您也可以切换到加入:

select *
from t2 
join
 ( select week from t1 -- i.e. your existing query to return the latest week 
 ) as t1
on t2.week >= t1.week 
qualify 
   dense_rank() -- next 52 week & partial weeks
   over (order by t2.week) <= 52

标量子查询的解释可能更好。