题目
表a包含日期和股市涨跌标记(1:跌,0:涨),请用任意SQL得到连续跌的天数,得到例如表b的效果。
表a
adate(日期) | tag(股市涨跌标记(1:跌,0:涨) |
---|---|
2023-1-16 | 1 |
2023-1-15 | 1 |
2023-1-14 | 1 |
2023-1-13 | 1 |
2023-1-12 | 0 |
2023-1-11 | 0 |
2023-1-10 | 0 |
2023-1-9 | 1 |
2023-1-8 | 0 |
表b
adate(日期) | tag(股市涨跌标记(1:跌,0:涨) | conti(连续跌的天数) |
---|---|---|
2023-1-16 | 1 | 4 |
2023-1-15 | 1 | 3 |
2023-1-14 | 1 | 2 |
2023-1-13 | 1 | 1 |
2023-1-12 | 0 | 0 |
2023-1-11 | 0 | 0 |
2023-1-10 | 0 | 0 |
2023-1-9 | 1 | 1 |
2023-1-8 | 0 | 0 |
求连续天数类型的题,我们核心的思路就是找出能够将每组连续值分开的标记,下面介绍该题的两种解法。
方法一
第一种方法也是求连续类问题时用到的最常规的方法,对adate和tag两列得到排好的row_number,作差,根据差值即可得到分组。最后再对组内排序即可,完整代码如下
Select adate, tag,
Case When tag = 0 Then 0 Else row_number()Over(Partition By diff Order By adate) End conti From
(
Select adate, tag,
Case When tag = 1 Then
row_number()Over(Order By adate desc) -
row_number()Over(Partition By tag Order By adate desc)
End diff
From a
)tmp
Order By adate desc
下面是逐步拆解
首先对两列进行分组排序,得到两列值。
Select adate, tag,
row_number()Over(Order