有这么个INT 字段 数据只有 1或2或3
只要1在2前面,2在3前面,3再1前面 就是连续的
比如: 1231232312312313123 如何判断最多连续出现的次数呢
------解决方案--------------------
那不就是求多少个123么?select (len(@a)-len(replace(cast(@a as varchar),'123','')))/3
------解决方案--------------------
我看是求多少个12,23,31才对.
------解决方案--------------------
我看是给楼上两位增加点乐趣才对
------解决方案--------------------
- SQL code
declare @str as varchar(100)set @str = '1231232312312313123'select '12的个数'=(len(@str) - len(replace(@str,'12','')))/2 , '23的个数'=(len(@str) - len(replace(@str,'23','')))/2 , '31的个数'=(len(@str) - len(replace(@str,'31','')))/2 , '总数' = (len(@str) - len(replace(@str,'12','')))/2 + (len(@str) - len(replace(@str,'23','')))/2 + (len(@str) - len(replace(@str,'31','')))/2/*12的个数 23的个数 31的个数 总数 ----------- ----------- ----------- ----------- 5 6 5 16(所影响的行数为 1 行)*/
------解决方案--------------------
楼上的是可以得到个数
但是是否考虑到楼主说的连续性问题
不知道我想的对不对
------解决方案--------------------
- SQL code
declare @str as varchar(100)set @str = '1231232312312313123'select (len(@str)-len(replace(@str,'1231','')))/4
------解决方案--------------------
CREATE TABLE t
(
id VARCHAR(20),
num VARCHAR(100)
)
INSERT INTO t
SELECT '1','12312323123123131231233212312312313112312312312312312312312323'
GO
--方法一字符读取方法
CREATE FUNCTION F_TOTAL(@s VARCHAR(200), @s1 VARCHAR(20))
RETURNS INT
AS
BEGIN
DECLARE @re INT, --返回结果
@st INT, --开始数字
@e INT, --结束数字
@i INT, --本次统计结果
@len INT --要统计的字符长度
SELECT @re = 0,@st = CHARINDEX(@s1,@s), @e = @st+1,@i = 0,@len = LEN(@s1)
WHILE CHARINDEX(@s1,@s,@e)>0
BEGIN
SET @e = CHARINDEX(@s1,@s,@st+1)
IF @e - @st = @len
SET @i = @i + 1
ELSE IF @e - @st > @len --如果结束数字和开始数字之和大于统计字符长度,表示统计的字符已经不再相联了
BEGIN
--如果统计的连续次数大于结果,那么把该次统计存储到结果
IF @re < @i
SET @re = @i
SET @i = 0
END
ELSE --表示结束
BEGIN
IF @re < @i
SET @re = @i
BREAK
END
SET @st = @e
END
RETURN CASE WHEN @re <> 0 THEN @re + 1 ELSE @re END --因为统计始终少了一次,所以必须加一
END
GO
--方法二,字符替换方法
CREATE FUNCTION F_TOTALONE(@s VARCHAR(200), @s1 VARCHAR(20))
RETURNS INT
AS
BEGIN
DECLARE @len INT
[email protected]
SET @len = (LEN(@s)-LEN(REPLACE(@s,@s1,'')))/LEN(@s1)
[email protected]'@'
SET @s = REPLACE(@s,@s1,'@')
WHILE @len >= 0
BEGIN
--如果符合条件,那么就退出
IF CHARINDEX(REPLICATE('@',@len),@s)>0
BREAK
SET @len = @len - 1
END
RETURN @len
END
GO
SELECT *,TOTALNUM=DBO.F_TOTAL(num,'123') FROM t
SELECT *,TOTALNUM=DBO.F_TOTALONE(num,'123') FROM t
DROP FUNCTION F_TOTAL
DROP FUNCTION F_TOTALONE
DROP TABLE t
id num TOTALNUM
-------------------- ---------------------------------------------------------------- -----------