Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我有一个系列是“12345234123543”。如何在SQL中编写一个函数,以找出给定序列中哪个数字出现次数最多?_Sql - Fatal编程技术网

我有一个系列是“12345234123543”。如何在SQL中编写一个函数,以找出给定序列中哪个数字出现次数最多?

我有一个系列是“12345234123543”。如何在SQL中编写一个函数,以找出给定序列中哪个数字出现次数最多?,sql,Sql,我有一个系列是“12345234123543”。如何用SQL编写函数以找出给定序列中哪个数字出现次数最多?如果您使用的是SQL Server,则可以这样做 DECLARE @Str VARCHAR(MAX)='12345234123123543' ;WITH CTE AS( SELECT CAST('' AS NVARCHAR(1)) AS CH, 1 AS CNT UNION ALL SELECT CAST(SUBSTRING(@Str,CNT,1)AS NVA

我有一个系列是“12345234123543”。如何用SQL编写函数以找出给定序列中哪个数字出现次数最多?

如果您使用的是SQL Server,则可以这样做

DECLARE @Str VARCHAR(MAX)='12345234123123543'

;WITH CTE AS(
     SELECT CAST('' AS NVARCHAR(1)) AS CH, 1 AS CNT
     UNION ALL
     SELECT CAST(SUBSTRING(@Str,CNT,1)AS NVARCHAR(1)) AS CH , CNT+1
     FROM CTE 
     WHERE CNT<=LEN(@Str)
)
SELECT TOP 1 CH,COUNT(CH) 
FROM CTE
WHERE CH <> '' 
GROUP BY CH 
ORDER BY COUNT(CH) DESC

如果您使用的是SQL Server,那么您可以这样做

DECLARE @Str VARCHAR(MAX)='12345234123123543'

;WITH CTE AS(
     SELECT CAST('' AS NVARCHAR(1)) AS CH, 1 AS CNT
     UNION ALL
     SELECT CAST(SUBSTRING(@Str,CNT,1)AS NVARCHAR(1)) AS CH , CNT+1
     FROM CTE 
     WHERE CNT<=LEN(@Str)
)
SELECT TOP 1 CH,COUNT(CH) 
FROM CTE
WHERE CH <> '' 
GROUP BY CH 
ORDER BY COUNT(CH) DESC

如果您使用Postgres,您可以使用以下内容:

select c, count(*) as cnt
from unnest(string_to_array('12345234123123543',null)) as t(c)
group by c
order by cnt desc
limit 1;
输出:

碳纳米管 -+-- 3 | 5 编辑:受Jaydip答案的启发,这实际上只能用标准SQL表示:

with recursive cte (ch, cnt) as (
     values ('', 1)
     union all
     select substring('12345234123123543' from cnt for 1) as ch, cnt+1
     from cte 
     where cnt <= character_length('12345234123123543')
)
select ch, count(ch) 
from cte
where ch <> '' 
group by ch 
order by count(ch) desc
fetch first 1 rows only

如果您使用Postgres,您可以使用以下内容:

select c, count(*) as cnt
from unnest(string_to_array('12345234123123543',null)) as t(c)
group by c
order by cnt desc
limit 1;
输出:

碳纳米管 -+-- 3 | 5 编辑:受Jaydip答案的启发,这实际上只能用标准SQL表示:

with recursive cte (ch, cnt) as (
     values ('', 1)
     union all
     select substring('12345234123123543' from cnt for 1) as ch, cnt+1
     from cte 
     where cnt <= character_length('12345234123123543')
)
select ch, count(ch) 
from cte
where ch <> '' 
group by ch 
order by count(ch) desc
fetch first 1 rows only

标记您正在使用的RDBMS我认为程序程序比SQL更适合您的需要。您使用的是哪种产品?博士后?神谕SQL只是一种查询语言,而不是特定数据库产品的名称。标记您使用的RDBMS我认为一个过程程序比SQL更适合您的需要。您使用的是哪种产品?博士后?神谕SQL只是一种查询语言,不是特定数据库产品的名称。哇,我从来不知道SQL能做这么酷的事情。也许是时候让我更深入地了解它,然后只做选择/插入/更新和删除:D@ManuelMannhardt:这不是100%标准SQL。string_to_数组是Postgres的扩展,但unnest实际上是标准限制的一部分,需要在标准SQLOh中用fetch first 1行替换。好吧,遗憾的是我大部分时间都在使用MySQL。但是,在过去的一年左右,我看到了很多你可以用它做的很酷的事情,只是从来没有想过。究竟什么是不必要的?字符串到数组对我来说很清楚。@ManuelMannhardt:unnest将数组转换成一组行。哇,我从来都不知道SQL能做这么酷的事情。也许是时候让我更深入地了解它,然后只做选择/插入/更新和删除:D@ManuelMannhardt:这不是100%标准SQL。string_to_数组是Postgres的扩展,但unnest实际上是标准限制的一部分,需要在标准SQLOh中用fetch first 1行替换。好吧,遗憾的是我大部分时间都在使用MySQL。但是,在过去的一年左右,我看到了很多你可以用它做的很酷的事情,只是从来没有想过。究竟什么是不必要的?字符串\u到\u数组对我来说很清楚。@ManuelMannhardt:unnest将数组转换为一组行。我感兴趣的是什么;这是执行速度更快还是“一匹没有名字的马”?嗨@ManuelMannhardt,我对postgres sql了解不多。所以我什么都不能说。但根据我的经验,CTE在性能上总是做得更好perspective@ManuelMannhardt:我很确定,在Postgres中,字符串到数组和unnest的组合比相应的CTE解决方案更快,这在Postgres中也是可能的,这也是我感兴趣的;这是执行速度更快还是“一匹没有名字的马”?嗨@ManuelMannhardt,我对postgres sql了解不多。所以我什么都不能说。但根据我的经验,CTE在性能上总是做得更好perspective@ManuelMannhardt:我敢肯定,在Postgres中,字符串到数组和unnest的组合比相应的CTE解决方案(在Postgres中也可能)更快