微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算数组中前面重复项的数量

如何解决计算数组中前面重复项的数量

我有以下查询,它遍历数组中的每个项目,然后回过头看看有多少重复的 f 包括它自己。

它可以工作,但是在大量行中会很慢 - 有没有更简洁的方法来处理数组中的序列?

SELECT
['p','p','f','f'] AS sequence,arrayMap( (x,y) -> (x,if (x='f',(arrayFirstIndex( k -> k=0,arrayCumSumNonNegative((n,index) -> n = 'f' ? 1 : -index,arrayReverse(arraySlice(sequence,1,y)) as arr,arrayEnumerate(arr)))
   )-1,0)),sequence,arrayEnumerate(sequence))

result:

[('p',0),('p',('f',1),2),3),4),3)]

提前致谢

解决方法

试试这个查询:

WITH 'f' AS ch
SELECT 
  arraySplit((x,i) -> x = ch and sequence[i - 1] != ch or x != ch and sequence[i - 1] = ch,sequence,arrayEnumerate(sequence)) parts,arrayMap(part -> arrayMap((x,index) -> (x,x = ch ? index : 0),part,arrayEnumerate(part)),parts) parts_and_number,arrayFlatten(parts_and_number) result
FROM (
  SELECT arrayJoin([
    ['p','p','f','f'],['p','w',['f','w'],['f']
  ]) as sequence)

/*
Row 1:
──────
parts:            [['p','p'],['p'],'f']]
parts_and_number: [[('p',0),('p',0)],[('f',1),('f',2),3),4)],[('p',3)]]
result:           [('p',4),3)]

Row 2:
──────
parts:            [['p',('w',3)]

Row 3:
──────
parts:            [['f','f']]
parts_and_number: [[('f',3)]]
result:           [('f',3)]

Row 4:
──────
parts:            [['p','w']]
parts_and_number: [[('p',0)]]
result:           [('p',0)]

Row 5:
──────
parts:            [['f',2)]]
result:           [('f',2)]

Row 6:
──────
parts:            [['f']]
parts_and_number: [[('f',1)]]
result:           [('f',1)]
*/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。