在子查询结果后检索 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
标量子查询的解释可能更好。
从包含销售额的 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
标量子查询的解释可能更好。