Как найти количество непрерывных раз, когда символ появляется в строке

#sql #sql-server #count #google-bigquery #bigquery-standard-sql

# #sql #sql-сервер #подсчитать #google-bigquery #bigquery-standard-sql

Вопрос:

У меня есть строка 11111122111131111111

Я хочу создать массив, содержащий количество раз, когда 1 появляется непрерывно, т.Е. Первые 6 символов — это 1 -> два 2 -> четыре 1 -> один 3 -> семь 1-х

Итак, результат, который я хочу, это [6,4,7]

Я знаю, как найти количество раз, когда символ появляется в строке, но как найти количество раз, когда они появляются в непрерывной скороговорке.

Комментарии:

1. Пожалуйста, укажите базу данных, которую вы используете. Я не знаю ни одной базы данных, которая фактически реализует «стандартный» SQL.

2. Пожалуйста, упомяните использование RDBMS

Ответ №1:

Приведенный ниже пример для стандартного SQL BigQuery

 #standardSQL
WITH `project.dataset.table` AS (
  SELECT '11111122111131111111' line
)
SELECT line, ARRAY(SELECT LENGTH(e) FROM UNNEST(REGEXP_EXTRACT_ALL(line, r'1 ')) e) result
FROM `project.dataset.table`   
 

с результатом

 [
  {
    "line": "11111122111131111111",
    "result": [
      "6",
      "4",
      "7"
    ]
  }
]
 

Ответ №2:

Немного неясно относительно фактической СУБД

Здесь мы используем специальную таблицу подсчета (подойдет любая таблица соответствующего размера). Затем мы применяем стандартные пробелы и острова.

Пример

 Declare @S varchar(500) = '11111122111131111111'
Declare @C varchar(10)  = '1'


Select Seq=Row_Number() over (Order by Seq)
      ,Cnt=count(*)
 From (
        Select N
              ,S = substring(@S,N,1)
              ,Seq = N - Row_Number() over (Order by N)
         From ( Select Top (len(@S)) 
                       N=Row_Number() Over (Order By (Select NULL)) 
                  From master..spt_values n1
              ) A
         Where substring(@S,N,1)=@C
      ) A
 Group By Seq
 Order By Seq
 

ВОЗВРАТ

 Seq Cnt
1   6
2   4
3   7
 

Ответ №3:

 ;WITH splitString(val) AS       
(
    -- convert the string to xml, seperating the elements by spaces
    SELECT    CAST('<r><i>'   REPLACE(@string,' ','</i><i>')   '</i></r>' AS XML)
)
SELECT  [Key],
        COUNT(*) [WordCount]
FROM    (   -- select all of the values from the xml created in the cte
            SELECT  p.value('.','varchar(100)') AS [Key]
            FROM    splitString
                    CROSS APPLY val.nodes('//i') t (p)) AS t
GROUP BY [Key]