如何在BigQuery中按52周间隔排序数据且避免使用JOIN?
问题描述
现有如下数据集:
| Date | Sales | Group |
|---|---|---|
| 2022-11-02 | xxxxxxxx | A |
| 2022-11-03 | xxxxxx | A |
| 2022-11-03 | xxxxxx | B |
| 2021-11-03 | xxxxxx | A |
| 2021-11-04 | xxxxxx | B |
| 2021-11-04 | xxxxxx | A |
需要将数据按52周间隔排序,排序后相邻行需满足 date_sub(second_row['date'], interval 52 week) == first row['date'],且禁止使用JOIN操作,期望的排序结果如下:
| Date | Sales | Group |
|---|---|---|
| 2022-11-02 | xxxxxxxx | A |
| 2021-11-03 | xxxxxx | A |
| 2022-11-03 | xxxxxx | A |
| 2021-11-04 | xxxxxx | A |
| 2022-11-03 | xxxxxx | B |
| 2021-11-04 | xxxxxx | B |
请问是否有可行的实现方式?
可行实现方案
可以通过构造排序键的方式实现,无需JOIN操作。核心思路是:
- 按
Group分组,确保同组数据集中排列 - 对每组内的日期,计算其「减去52周后的基准日期」,将同一基准组的新老日期绑定
- 先按基准日期排序,再按日期降序排列,让新日期在前、对应52周前的日期在后,满足相邻行的日期要求
以MySQL为例,SQL语句如下:
SELECT Date, Sales, `Group` FROM your_table ORDER BY `Group`, -- 构造基准日期:当前日期减52周,作为新老日期的排序锚点 DATE_SUB(Date, INTERVAL 52 WEEK), -- 降序排列,让较新的日期排在对应旧日期前面 Date DESC;
逻辑说明:
- 先按
Group排序,保证A、B组数据各自集中 DATE_SUB(Date, INTERVAL 52 WEEK)生成基准日期:2022-11-02减52周后是2021-11-03,和2021-11-03的基准日期一致,因此这两行会归为同一排序组;同理2022-11-03的基准日期是2021-11-04,和2021-11-04的基准日期一致- 最后按
Date DESC排序,让每组内的新日期排在旧日期前,正好满足相邻行日期差52周的要求
其他SQL方言(如PostgreSQL)语法略有调整,但核心逻辑一致:
SELECT Date, Sales, "Group" FROM your_table ORDER BY "Group", Date - INTERVAL '52 weeks', Date DESC;
此方案全程无需JOIN操作,可得到期望的排序结果。
内容的提问来源于stack exchange,提问作者Skylar
相关产品推荐
相关产品推荐

