How to extract ascending subsets from the sequence?

你说的曾经没有我的故事 提交于 2021-02-10 11:57:23

问题


I have some data:

┌─id--┬─serial┐
│ 1   │     1 │
│ 2   │     2 │
│ 3   │     3 │
│ 4   │     1 │
│ 5   │     3 │
│ 6   │     2 │
│ 7   │     1 │
│ 8   │     2 │
│ 9   │     3 │
│ 10  │     1 │
│ 11  │     2 │
│ 12  │     1 │
│ 13  │     2 │
│ 14  │     3 │
└─────┴───────┘

I want to group by column 'serial' where the group rule is: any ascending subset (like this, 1 -> 2 -> 3) is a group.

I expect result:

┌─id--┬─serial┬─group─┐
│ 1   │     1 │ 1     │
│ 2   │     2 │ 1     │
│ 3   │     3 │ 1     │
│ 4   │     1 │ 2     │
│ 5   │     3 │ 2     │
│ 6   │     2 │ 3     │
│ 7   │     1 │ 4     │
│ 8   │     2 │ 4     │
│ 9   │     3 │ 4     │
│ 10  │     1 │ 5     │
│ 11  │     2 │ 5     │
│ 12  │     1 │ 6     │
│ 13  │     2 │ 6     │
│ 14  │     3 │ 6     │
└─────┴───────┴───────┘

回答1:


If I right understand you wanna split the set into subsets with ascending trend.

SELECT r.1 id, r.2 serial, r.3 AS group, arrayJoin(result) r
FROM (
  SELECT 
    groupArray((id, serial)) sourceArray,
    /* find indexes where the ascending trend is broken */  
    arrayFilter(i -> (i = 1 OR sourceArray[i - 1].2 > sourceArray[i].2), arrayEnumerate(sourceArray)) trendBrokenIndexes,
    /* select all groups with ascending trend and assign them group-id */
    arrayMap(i -> 
      (i, arraySlice(sourceArray, trendBrokenIndexes[i], i < length(trendBrokenIndexes) ? trendBrokenIndexes[i+1] - trendBrokenIndexes[i] : null)), 
      arrayEnumerate(trendBrokenIndexes)) groups,
    /* prepare the result */
    arrayReduce('groupArrayArray', arrayMap(x -> arrayMap(y -> (y.1, y.2, x.1), x.2), groups)) result    
  FROM (
    /* source data */
    SELECT arrayJoin([(1 , 1),(2 , 2),(3 , 3),(4 , 1),(5 , 3),(6 , 2),(7 , 1),(8 , 2),(9 , 3),(10, 1),(11, 2),(12, 1),(13, 2),(14, 3)]) a, a.1 id, a.2 serial
    ORDER BY id))

/* Result
┌─id─┬─serial─┬─group─┬─r────────┐
│  1 │      1 │     1 │ (1,1,1)  │
│  2 │      2 │     1 │ (2,2,1)  │
│  3 │      3 │     1 │ (3,3,1)  │
│  4 │      1 │     2 │ (4,1,2)  │
│  5 │      3 │     2 │ (5,3,2)  │
│  6 │      2 │     3 │ (6,2,3)  │
│  7 │      1 │     4 │ (7,1,4)  │
│  8 │      2 │     4 │ (8,2,4)  │
│  9 │      3 │     4 │ (9,3,4)  │
│ 10 │      1 │     5 │ (10,1,5) │
│ 11 │      2 │     5 │ (11,2,5) │
│ 12 │      1 │     6 │ (12,1,6) │
│ 13 │      2 │     6 │ (13,2,6) │
│ 14 │      3 │     6 │ (14,3,6) │
└────┴────────┴───────┴──────────┘
*/


来源:https://stackoverflow.com/questions/57756729/how-to-extract-ascending-subsets-from-the-sequence

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!