在子查询结果后 52 周检索
Posted
技术标签:
【中文标题】在子查询结果后 52 周检索【英文标题】:Retrieving 52 weeks after the result of a subquery 【发布时间】:2020-03-26 10:43:07 【问题描述】:从包含销售额的表中,我检索了该表的最后一周。这给了我最后一周的销售情况。 “日期”总是一个月的第一天,但没关系,真正重要的数据是星期和部分星期。 结果很简单:
+------------+---------+--------------+
| Date | Week | Partial_week |
+------------+---------+--------------+
| 2020-02-01 | 2020-09 | 2020M02W09 |
+------------+---------+--------------+
我们称之为 t1
我有一张表,其中包含 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 左右之前,这应该让我每周和部分几周)。
我很想拥有一个
'从 t2 中选择前 52 个不同的周'
加入 t1 并有一个 where 子句 'where t1.week
然后再次加入 t2 上的所有内容以获得每个部分周,
但这不起作用,因为每周 t1.week 等于 null(我希望 t1.week 可以只是一个变量,因为它只有一行......)
任何想法都将不胜感激。
【问题讨论】:
【参考方案1】:您的逻辑似乎很接近。将初始查询放在标量子查询中,以像变量一样处理它:
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
标量子查询的解释可能会更好。
【讨论】:
经过一些调整,您提出的第一个解决方案非常有效;)非常感谢,我现在必须了解有关标量子查询的更多信息。以上是关于在子查询结果后 52 周检索的主要内容,如果未能解决你的问题,请参考以下文章
使用 peewee 创建子查询,在子查询结果上使用 `.select`
如何在子查询结果中找到记录,其中项目的结果为假且没有结果为真?