- 昨天收到一個朋友的求助,一個特殊的分組需求,來源數據和目標結果數據如下(上面是來源數據,下面是展示的數據)。
name | score | flag |
---|---|---|
XX1 | 95 | 0 |
XX1 | 80 | 0 |
XX1 | 80 | 1 |
XX1 | 70 | 0 |
XX1 | 90 | 1 |
name | score |
---|---|
XX1 | 255 |
XX1 | 160 |
- 其實就是按照flag列進行分組,不過是按照flag=1來進行區間分組。與我們常見的0為一組,1位一組不一樣,從上面的結果可以看到是按flag=1位界限,把數據前三行分為一組、后兩行分為一組。例如下表格,flag=1把這列截成了4部分,也就是可以按照flag分為四組:
flag | groupId |
---|---|
0 | 1 |
0 | 1 |
0 | 1 |
0 | 1 |
1 | 1 |
1 | 2 |
0 | 3 |
0 | 3 |
1 | 3 |
0 | 4 |
1 | 4 |
- 乍一看好像還是很簡單的,但是仔細一想又不是那么容易。由于當時沒有sql環境,就在excel里面畫了畫,思路如下(sql就不提供了,各位小伙伴有興趣的話可以去寫寫看):對over這種不理解的小伙伴們要去補充一下分析函數的知識了。
flag | lead | sum_1 | sum_2 | groupId |
---|---|---|---|---|
0 | 0 | 0 | 4 | 4 |
0 | 0 | 0 | 4 | 4 |
0 | 0 | 0 | 4 | 4 |
0 | 0 | 0 | 4 | 4 |
1 | 0 | 0 | 4 | 4 |
1 | 1 | 1 | 4 | 3 |
0 | 1 | 2 | 4 | 2 |
0 | 0 | 2 | 4 | 2 |
1 | 0 | 2 | 4 | 2 |
0 | 1 | 3 | 4 | 1 |
1 | 0 | 3 | 4 | 1 |
columns | comments |
---|---|
flag | 數據源里面的flag字段 |
lead | flag字段往下移一位(lead()over()) |
sum_1 | 對lead的值進行累加(sum()over(order by)) |
sum_2 | 對flag的值進行sum(sum()over()) |
groupId | sum_2-sum1 |