在论坛中出现的比较难的sql问题:27(字符串拆分、字符串合并、非连续数字的间隔范围、随机返回字符串)

本文针对SQL面试中的常见问题提供了解决方案,包括字符串拆分、非连续数字范围处理、字符串合并、子串出现次数计算及表空间大小查询等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在论坛中看到一个帖子,帖子中有一些sql方面的面试题,我觉得这些面试题很有代表性。


原帖的连接为:http://bbs.youkuaiyun.com/topics/390884161?page=1#post-398177057


下面是我的解法,供大家参考:


1、分拆字符串

create table test1 (number varchar(100))
insert into test1 values ('1,2,3,4,5,6')

希望结果:

number
------
1
2
3
4
5
6

(6 行受影响)

我的解法:

--1.拆分字符串
create table test1 (number varchar(100))
insert into test1 values ('1,2,3,4,5,6')


select --t.number,
       SUBSTRING(t.number, s.number ,CHARINDEX(',',t.number+',',s.number)-s.number) as number
from test1 t,master..spt_values s
where s.number >=1
and s.type = 'P'
and SUBSTRING(','+t.number,s.number,1) = ','
/*
number
1
2
3
4
5
6
*/

2、非连续数字的范围

create table test2(number int)
insert into test2 values 
(1),(2),(3),(4),(5),(7),(8),
(10),(11),(13),(15)

实现效果
number
---------------------
1~5
7~8
10~11
13
15

我的解法:

--2.非连续数字的间隔
create table test2(number int)
insert into test2 values 
(1),(2),(3),(4),(5),(7),(8),
(10),(11),(13),(15)


;with t
as
(
select *,
       row_number() over(order by number) rn
from test2
)

select case when min(number)=max(number) then cast(min(number) as varchar) 
            else cast(min(number) as varchar)+'~'+cast(max(number) as varchar) end as number
from t
group by number-rn
/*
number
1~5
7~8
10~11
13
15
*/

3、合并字符串

create table test4 (name varchar(10),mytype varchar(10),cj int )

insert into test4 
values('张三','语文',83),
('张三','数学',65),
('张三','物理',85),
('李四','语文',73),
('李四','数学',69),
('李四','物理',93)


实现效果
name	mytype	            cj
张三	语文,数学,物理	83,65,85
李四	语文,数学,物理	73,69,93

我的解法:

--3.合并字符串
create table test4 (name varchar(10),mytype varchar(10),cj int )

insert into test4 
values('张三','语文',83),
('张三','数学',65),
('张三','物理',85),
('李四','语文',73),
('李四','数学',69),
('李四','物理',93)


select name,
       stuff((select ','+mytype from test4 t4 where t4.name = test4.name for xml path('')),1,1,'') as mytype,
	   stuff((select ','+cast(cj as varchar) from test4 t4 where t4.name = test4.name for xml path('')),1,1,'') as cj
from test4
group by name
/*
name	mytype	cj
李四	语文,数学,物理	73,69,93
张三	语文,数学,物理	83,65,85
*/

4、写一个函数,输入2个varchar参数@str1,@str2,返回字符串@str1 在@str2中出现的次数,@int.

如(@str2=’abcsaac',@str1='a') 返回3。


我的解法:

--4.串1在串2出现次数
declare @str2 varchar(100)='abcsaac'
declare @str1 varchar(10)='a'


select (len(@str2) - len(replace(@str2,@str1,''))) / len(@str1) as t  --这里需要除以字符串1的长度
/*
t
3
*/

5、查询所有表空间的大小,并按照从大到小排序。


我的解法:

--5.返回表的大小,按照从大到小排序
create table tb1
(
name varchar(100),
rows numeric,
reserved varchar(100),
data varchar(100),
index_size varchar(100),
unused varchar(100)
)

exec sp_msforeachtable 'insert into tb1 exec sp_spaceused ''?'''

select *
from tb1
order by cast(replace(reserved,' KB','') as numeric) desc 

6、随机返回指定个数的字符

写一个存储过程。输入参数@int,返回随机@int 个字母。如输入5个。返回随机5个字母。


我的解法:

--6.随机返回指定个数的字符
declare @int int 
declare @str varchar(1000)

set @int = 5
set @str = ''

select @str = @str + char(ascii('A') + abs(checksum(newid())) % 26)
from master..spt_values 
where type='P'
and number between 1 and @int


select @str
/*
EPOZQ
*/


### Hive 中合并区间的原理与实现 在大数据场景中,Hive 是一种常用的分布式数据分析工具。对于区间合并问题,通常可以通过窗口函数、自连接或其他复杂 SQL 技术来完成。以下是关于如何在 Hive 中高效处理和优化区间合并的相关内容。 #### 1. 使用窗口函数 `ROW_NUMBER()` 实现去重与分组 通过窗口函数可以为每一条记录分配唯一的编号,从而便于后续的分组或筛选操作。例如,在给定数据集中,可以根据某些字段进行分区,并按照特定顺序排列: ```sql SELECT *, row_number() OVER (PARTITION BY uin ORDER BY statis_day ASC) AS rn FROM your_table; ``` 上述语句的作用是对每个 `uin` 的记录按日期升序排列,并为其分配一个递增的行号[^4]。这一步骤有助于识别连续的时间段或者重复项。 #### 2. 处理时间差计算 当涉及到多个时间段之间的差异时,可以利用 LATERAL VIEW 和聚合函数来进行扩展运算。比如下面的例子展示了如何拆分字符串以及求最大值减最小值得到间隔长度: ```sql SELECT a, MAX(b) - MIN(b) AS diff FROM ( SELECT t.*, lateral_view_explode(split(t.a, '-')) AS b FROM your_table t ) subquery GROUP BY a; ``` 这里的关键在于使用了 `LATERAL VIEW EXPLODE` 将单个字段分解成多条独立记录以便进一步分析其内部结构特性[^5]。 #### 3. 基于业务需求设计物理模型 考虑到实际应用中的效率问题,应该根据具体的访问模式选择合适的存储方式——即决定采用行存还是列存。一般来说: - 如果频繁执行的是全量扫描类查询,则建议选用支持高压缩率的列式文件格式(Parquet/ORC),这样能够显著减少I/O开销; - 对于那些包含大量随机写入请求的应用程序来说,传统的基于文本的日志型表可能更加适合一些简单事务性的读取任务;但是随着规模增大之后就会暴露出明显的短板如低效索引机制等问题因此需要权衡利弊做出最佳决策[^3]. 另外需要注意一点就是排序操作本身是非常耗资源的动作因为它默认只会启动唯一的一个reducer来做这件事情所以最好事先做一些预处理工作比如说先做一次groupby之类的轻量化汇总然后再交给最终阶段去做精确的结果输出以免造成不必要的负担进而拖累整体流程的表现效果[^1]. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值