需求: 现有一个逗号分隔的,由0和1 组成的字符串,要从这个字符串中找到0连续出现的最大次数。
要求: 用SQL实现
字符串示例: ‘0,1,0,0,1,1,0,0,0,0,0,1,0,0,1’
解题思路:
- 求字符串中0连续出现的最大次数,也就是求0组成的字符串的最大长度,能想到这一点问题就解决一半了。
- 如何找到包含0的字符串?
因为这个字符串中只有0,1,逗号。把逗号去除掉后,在按1进行分割,就能找到包含0的字符串。 - 求出每个包含0的字符串的长度
- 求包含0的字符串长度的最大值
-- 在ClickHouse中的实现方式如下:
SELECT replace('0,1,0,0,1,1,0,0,0,0,0,1,0,0,1', ',', '') AS a1
┌─a1──────────────┐
│ 010011000001001 │
└─────────────────┘
SELECT splitByString('1', replace('0,1,0,0,1,1,0,0,0,0,0,1,0,0,1', ',', '')) AS a2
┌─a2────────────────────────────┐
│ ['0','00','','00000','00',''] │
└───────────────────────────────┘
SELECT arrayJoin(splitByString('1', replace('0,1,0,0,1,1,0,0,0,0,0,1,0,0,1', ',', ''))) AS a3
┌─a3────┐
│ 0 │
│ 00 │
│ │
│ 00000 │
│ 00 │
│ │
└───────┘
SELECT LENGTH(arrayJoin(splitByString('1', replace('0,1,0,0,1,1,0,0,0,0,0,1,0,0,1', ',', '')))) AS a4
┌─a4─┐
│ 1 │
│ 2 │
│ 0 │
│ 5 │
│ 2 │
│ 0 │
└────┘
SELECT max(LENGTH(arrayJoin(splitByString('1', replace('0,1,0,0,1,1,0,0,0,0,0,1,0,0,1', ',', ''))))) AS max_len_0
┌─max_len_0─┐
│ 5 │
└───────────┘
最近有个朋友经常提到他思考问题的方式。不断的迭代,需求最优解。顺着他的这个思路,尝试了另一种实现方式。
在此一并奉献出来。
感谢NYJ。
SELECT arrayMax(arrayMap(x -> LENGTH(x), splitByString('1', replace('0,1,0,0,1,1,0,0,0,0,0,1,0,0,1', ',', '')))) AS max_len_0
┌─max_len_0─┐
│ 5 │
└───────────┘