#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]