Teradata SQL中如何根据BEGINNING_DATE变化获取前序GRADE值
问题:按ID分组,根据BEGINNING_DATE变化获取前序GRADE值
原始数据
| ID | GRADE | BEGINNING_DATE | ENDING_DATE |
|---|---|---|---|
| 1 | 12 | 14/06/2021 | 14/06/2022 |
| 1 | 12 | 14/06/2021 | 14/06/2022 |
| 1 | 14 | 22/03/2022 | 22/03/2023 |
| 1 | 14 | 22/03/2022 | 22/03/2023 |
| 1 | 15 | 22/03/2023 | 22/03/2024 |
| 1 | 15 | 22/03/2023 | 22/03/2024 |
| 2 | 13 | 15/01/2022 | 15/01/2023 |
| 2 | 13 | 15/01/2022 | 15/01/2023 |
| 2 | 17 | 01/09/2023 | 01/09/2024 |
| 2 | 17 | 01/09/2023 | 01/09/2024 |
期望结果
按ID分组,当BEGINNING_DATE变化时获取前序GRADE值:
| ID | GRADE | BEGINNING_DATE | ENDING_DATE | LAG_GRADE |
|---|---|---|---|---|
| 1 | 12 | 14/06/2021 | 14/06/2022 | ? |
| 1 | 12 | 14/06/2021 | 14/06/2022 | ? |
| 1 | 14 | 22/03/2022 | 22/03/2023 | 12 |
| 1 | 14 | 22/03/2022 | 22/03/2023 | 12 |
| 1 | 15 | 22/03/2023 | 22/03/2024 | 14 |
| 1 | 15 | 22/03/2023 | 22/03/2024 | 14 |
| 2 | 13 | 15/01/2022 | 15/01/2023 | ? |
| 2 | 13 | 15/01/2022 | 15/01/2023 | ? |
| 2 | 17 | 01/09/2023 | 01/09/2024 | 13 |
| 2 | 17 | 01/09/2023 | 01/09/2024 | 13 |
尝试的SQL(未得到期望结果)
SELECT A.*, LAG(GRADE) OVER (PARTITION BY ID,BEGINNING_DATE ORDER BY ENDING_DATE) AS LAG_GRADE FROM DATA A
解决方案
通过先提取每个ID和BEGINNING_DATE的唯一组合,计算该组合对应的前序GRADE,再关联回原始数据,即可得到所有重复行的对应前序值:
WITH DATA AS ( SELECT DISTINCT ID, GRADE, BEGINNING_DATE FROM grade_data ), LAG_DATA AS ( SELECT D.*, LAG(D.GRADE) OVER (PARTITION BY D.ID ORDER BY D.BEGINNING_DATE ) AS LAG_GRADE FROM DATA D ) SELECT GRADE.*, LD.LAG_GRADE FROM grade_data GRADE LEFT JOIN LAG_DATA LD ON GRADE.ID=LD.ID AND GRADE.BEGINNING_DATE = LD.BEGINNING_DATE
内容的提问来源于stack exchange,提问作者Arthur_75
相关产品推荐
相关产品推荐

