在子查询结果后 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 周检索的主要内容,如果未能解决你的问题,请参考以下文章

在子表单中搜索值 (vba Access 2013)

使用 peewee 创建子查询,在子查询结果上使用 `.select`

Sqlite:在子查询“消除”结果中排序

如何在子查询结果中找到记录,其中项目的结果为假且没有结果为真?

如何在一个查询中通过 LINQ Include 检索子数据以提高性能?

尝试在 A 列中查找 B 列的实例数并在子查询中输出结果