更难的SQL题目!!!

更难的SQL题目!!!
Q:再考一道SQL面试难题,因为是英文翻译过来的,不知道大家能不能理解我的意思
再问大家一道SQL面试题

表a

字段
a1,a2,a3,a4,a5,a6,a7,a8


请统计出每两列重复,三列重复,四列重复,五列重复,6列重复,7列重复记录的值

统计结果如下

重复2列的 XXX
重复3列的 XXX
重复4列的 XXX
重复5列的 XXX
重复6列的 XXX
重复7列的 XXX

比如记录中如果出现 a1=a2 有两行那就表示两列重复的值为2

但是如果是三列之间相等那要算3列的,和两列之间无关了,前面说的两列相等要仅仅两列相等
后面的不管说多少列都要说仅仅.就是仅仅两列相等的,仅仅三列相等的。如果四列相等就不能算到三列相等中去


请做出这个统计,不知道大意大家明白没,我当时看题目是英文的,大意是这样的,请大家看看,是否有点难解

比如
一行数据为:1, 1, 2, 2, 3, 3, 4, 4
该如何统计
虽然重复多个,但是算一行,就是两个重复的


1, 1, 2, 2, 3, 3, 4, 4 算两个重复的一列
1, 1, 2, 5, 6, 3, 4, 9算两个重复的一列
1, 1, 1, 3, 5, 7 ,2 ,6 算三个重复的一列
1, 1, 1 , 3, 3 ,3 8 ,8 算三个重复的一列

就是说任何字段间记录出现两个相同的就算去统计(3列同就跑到三列的那个范围去了,就不在这里了。两个只相同出现多次不要紧)

就算重复2列的 XXX

就是说任何字段间记录出现三个相同的就算去统计(4列同就跑到4列的那个范围去了,就不在这里了。4个只相同出现多次不要紧,呵呵,不过如果是5个出现相同就不可能出现两对了,因为就8个字段)

就算重复3列的 XXX


A:
I〉针对一般情况的情况的处理
方法一:with tt as (
select 1 no1, 1 no2, 2 no3, 2 no4, 3 no5, 3 no6, 4 no7 , 4 no8 from dual
)
select max(count(0)) from(
select decode(rn,1,no1,2,no2,3,no3,4,no4,5,no5,6,no6,7,no7,8,no8)col from(
select tt.*,a.rn from tt,(select rownum rn from dual connect by rownum<9) a
)) group by col
方法二:
create table test(a number,b number,c number,d number,e number,f number,g number,h number);
insert into test values(1, 1, 2, 2, 3, 3, 4, 4 );
insert into test values(1, 1, 2, 5, 6, 3, 4, 9 );
insert into test values(1, 1, 1, 3, 5, 7, 2, 6 );
insert into test values(1, 1, 1, 3, 3, 3, 8, 8 );


create or replace type t_object as object(
id varchar2(60),
sub_id varchar2(60));
/

create type t_ret_table is table of t_object;
/

create or replace function f_test(var_str in varchar2) return t_ret_table PIPELINED
as
var_tmp varchar2(60);
var_element varchar2(60);
begin
for i in (select a||'@@'||b||'@@'||c||'@@'||d||'@@'||e||'@@'||f||'@@'||g||'@@'||h id from test) loop
var_tmp := i.id;
while instr(var_tmp,'@@')>0 loop
var_element := substr(var_tmp,1,instr(i.id,'@@')-1);
var_tmp := substr(var_tmp,instr(i.id,'@@')+2,length(var_tmp));
pipe row(t_object(i.id,var_element));
end loop;
pipe row(t_object(i.id,var_tmp));
end loop;
return;
end f_test;
/

SQL> select replace(id,'@@') id,max(sl) from (select id,sub_id,count(*) sl from (select * from table(f_test('a'))) group by id,sub_id) group by id;

ID MAX(SL)
------------------------------------------------------------ ----------
11133388 3
11135726 3
11223344 2
11256349 2

II〉针对连续列相同才计算的情况的处理

分两种情况
1.每一列的长度为1,也就是单字符char(1)的
2.每一列得长度不定,也就是varchar2

测试用表;
create table uss
(
a1 varchar2(10),
a2 varchar2(10),
a3 varchar2(10),
a4 varchar2(10),
a5 varchar2(10),
a6 varchar2(10),
a7 varchar2(10),
a8 varchar2(10)
)
nologging;
一:对于1
A:插入测试数据:
insert into uss values('1','1','1','1','2','2','3','4');
insert into uss values('1','1','3','3','2','2','3','4');
insert into uss values('1','1','3','3','2','2','3','4');
insert into uss values('1','1','1','1','2','2','3','4');
insert into uss values('1','1','1','1','2','2','3','4');
insert into uss values('1','1','6','1','2','1','3','4');
insert into uss values('1','1','1','6','2','1','3','4');
commit;
B:建立函数
create or replace function foundoutchar1(str in varchar2) return varchar2 as
instr number := 0;
instr1 number := 0;
begin
for i in 2 .. length(str)
loop
if (substr(str,i,1) = substr(str, i - 1, 1)) then
instr := instr + 1;
if (i = length(str) and instr > instr1) then
instr1 := instr;
end if;
else
if (instr > instr1) then
instr1 := instr;
end if;
instr := 0;
end if;
end loop;
return '重复' || (instr1+1) || '列的';
end;
C:运行的sql:
select count(foundoutchar1(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8)) aa,
foundoutchar1(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8) aa1
from uss t
group by foundoutchar1(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8);
D:执行结果
SQL> set serveroutput on
SQL>
SQL> select count(foundoutchar1(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8)) aa,
2 foundoutchar1(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8) aa1
3 from uss t
4 group by foundoutchar1(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8)
5 ;

AA AA1
---------- --------------------------------------------------------------------------------
1 重复3列的
3 重复4列的
3 重复2列的
二:对于2
A:插入测试数据:
truncate table uss;

insert into uss values('11','11','11','11','22','22','33','44');
insert into uss values('11','11','33','33','22','22','33','44');
insert into uss values('11','11','33','33','22','22','33','44');
insert into uss values('11','11','11','11','22','22','33','44');
insert into uss values('11','11','11','11','22','22','33','44');
insert into uss values('11','11','66','11','22','11','33','44');
insert into uss values('11','11','11','66','22','11','33','44');
commit;
B:建立函数
create or replace function foundoutchar(str in varchar2,chrlength in varchar2) return varchar2 as
instr number := 0;
instr1 number := 0;
forinc number :=1;
forinc1 number :=1;
begin
for i in 2 .. length(chrlength)
loop
forinc:=forinc+to_number(substr(chrlength,i-1,1));
if (substr(str,forinc,to_number(substr(chrlength,i,1))) = substr(str, forinc1, to_number(substr(chrlength,i-1,1)))) then
instr := instr + 1;
if (i = length(chrlength) and instr > instr1) then
instr1 := instr;
end if;
else
if (instr > instr1) then
instr1 := instr;
end if;
instr := 0;
end if;
forinc1:=forinc1+to_number(substr(chrlength,i-1,1));
end loop;
return '重复' || (instr1+1) || '列的';
end;
C:运行的sql:
select count(foundoutchar(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8,
length(t.a1) || length(t.a2) || length(t.a3) ||
length(t.a4) || length(t.a5) || length(t.a6) ||
length(t.a7) || length(t.a8))) aa,
foundoutchar(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8,
length(t.a1) || length(t.a2) || length(t.a3) ||
length(t.a4) || length(t.a5) || length(t.a6) ||
length(t.a7) || length(t.a8)) aa1
from uss t
group by foundoutchar(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8,
length(t.a1) || length(t.a2) || length(t.a3) ||
length(t.a4) || length(t.a5) || length(t.a6) ||
length(t.a7) || length(t.a8));
D:执行结果
SQL> select count(foundoutchar(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8,
2 length(t.a1) || length(t.a2) || length(t.a3) ||
3 length(t.a4) || length(t.a5) || length(t.a6) ||
4 length(t.a7) || length(t.a8))) aa,
5 foundoutchar(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8,
6 length(t.a1) || length(t.a2) || length(t.a3) ||
7 length(t.a4) || length(t.a5) || length(t.a6) ||
8 length(t.a7) || length(t.a8)) aa1
9 from uss t
10 group by foundoutchar(t.a1 || t.a2 || t.a3 || t.a4 || t.a5 || t.a6 || t.a7 || t.a8,
11 length(t.a1) || length(t.a2) || length(t.a3) ||
12 length(t.a4) || length(t.a5) || length(t.a6) ||
13 length(t.a7) || length(t.a8));

AA AA1
---------- --------------------------------------------------------------------------------
1 重复3列的
3 重复4列的
3 重复2列的


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/694276/viewspace-51413/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/694276/viewspace-51413/

SQL知识点及难题汇总 题目一: 计算部门工资最高的员工【多字段+IN】 Employee 表:每个员工对应的 Id,name salary 和 department Id。 Department 表:每个部门对应的ID和name。 编写一个 SQL 查询,找出每个部门工资最高的员工。 思路: 一般分字段排序会使用窗口函数,但对于需要对两个以上字段进行匹配的题目,更适合用多字段+IN函数的方法,当然此题可用窗口函数 首先在自查询中用聚合函数group by选出每个部门最高的工资,再用where语句进行对部门和工资两个字段进行 阅读详情

相关推荐

SQL难题:

题目一:students数据表包括id(学生编号)、name(姓名)、class(班级)和score(分数)这四个字段。用SQL语句查询students表中所有3班学生的分数中位数。

xxq0517的博客 1682

SQL常见问题整理(一)

1.从表中查询数据 (1)指定查询的行与列 where子句 (2)指定查询结果中列的别名 as 注:不能在where子句中使用列别名 (3)查询结果排序 order by 降序排序在排序字段后加DESC 自定义排序:使用field()将列值映射到一个序列中,该序列可以按照所需的排序为列赋值order by field(name,‘Henry’,‘Suzi’,‘Ben’) (4)过滤重复行 distinct 统计唯一结果的数量 count(distinct A) (5)处理NULL值 is null、is n

weixin_47970003的博客 1726

LeetCode-SQL题目集

序号 题号 题目 题解链接 标签 备注 1 176 176. 第二高的薪水 【LeetCode-SQL】176. 第二高的薪水 2 184 184. 部门工资最高的员工 【LeetCode-SQL】184. 部门工资最高的员工 3 4 5 6 7 8 9 10 .........

HeavenDan的博客 9243

sql连续问题通解进阶(秒杀困难题不是梦)

上一篇文章中通过两个较为简单的例子了sql查询语句中连续问题的解法,这一篇我们来通过两道稍有难度的连续问题来更深刻的理解我在前篇中所讲的通过构造连续标识列与连续判断列的解法回顾一下我们的解法:1.准备具有连续标识列,以及连续判断列的表2.用连续标识列减去连续判断列构造辅助列3.同时group by辅助列与分组依据,配合聚合函数完成题目要求提示:以下是本篇文章正文内容,下面案例可供参考leetcode1225(困难)题目描述数据结构返回格式leetcode1811(中等)题目描述数据结构。

2202_75556204的博客 915

数据库SQL语句题目实训

数据库SQL语句题目实训题目所涉及的表:题目分类:单表查询集合查询多表查询嵌套查询总结 题目所涉及的表: . . 学生表:Student(Sno,Sname,Ssex,Sage,Sdept) 课程表:Course(Cno,Cname,Cpno,Ccredit) 学生选课表:SC(Sno,Cno,Grade) . . 题目分类: . 具体题目后的【】内容为题目主要所涉及到的知识点。 . 单表查询 . 1. 查询全体学生的信息。【查询全部列】 select * from Student . 2.

Aquarius'33 7091

SQL笔试经典50题及答案解析(题目21-30)

前言 最近博主在准备数据分析岗位的笔试和面试,其中的考察重点就是SQL。听说练了这50道题目,什么现场手撕SQL统统都不怕,我就赶紧来练习了!壮士们,练完以后就什么都不怕啦~ 环境: Navicat Premium 12 说明: 本篇练习的是题目21-30,其余参考链接 文章目录创建表表说明表创建表显示题目题目21题目22题目23题目24题目25题目26题目27题目28题目29题目30 创建表 表...

weixin_43890183的博客 3951

SPL比SQL更难了还是更容易了?

SPL作为专门用于结构化和半结构化数据的处理技术,在实际应用时经常能比SQL快几倍到几百倍,同时代码还会短很多,尤其在处理复杂计算时优势非常明显。用户在看到这些应用效果后对SPL往往很感兴趣,但又担心掌握起来太难,毕竟SPL的理念和语法都跟SQL有较多不同,这要求用户需要重新了解一些概念和学习新的语法,用户可能会心生疑虑。那么SPL的上手难度究竟如何呢?这里我们以SQL为起点讨论一下这个问题。

石臻说AI(szzdzhp001) 【原名 石臻臻的杂货铺】 2万+

SQL笔试经典50题及答案解析(题目31-40)

前言 最近博主在准备数据分析岗位的笔试和面试,其中的考察重点就是SQL。听说练了这50道题目,什么现场手撕SQL统统都不怕,我就赶紧来练习了!壮士们,练完以后就什么都不怕啦~ 环境: Navicat Premium 12 说明: 本篇练习的是题目31-40,其中部分题目缺失。剩下的这几道题,真的都很简单,对新手不要太友好~ 文章目录创建表表说明表创建表显示题目题目31题目32题目37(有问题)题目...

weixin_43890183的博客 3144

SPL 比 SQL 更难了还是更容易?

SPL作为专门用于结构化和半结构化数据的处理技术,在实际应用时经常能比SQL快几倍到几百倍,同时代码还会短很多,尤其在处理复杂计算时优势非常明显。用户在看到这些应用效果后对SPL往往很感兴趣,但又担心掌握起来太难,毕竟SPL的理念和语法都跟SQL有较多不同,这要求用户需要重新了解一些概念和学习新的语法,用户可能会心生疑虑。 那么SPL的上手难度究竟如何呢?这里我们以SQL为起点讨论一下这个问题。SQL一直以来都是使用最广泛的结构化数据查询语言,在实现一般的查询计算时非常简单。像分组汇总一句简单的group

小威的博客 2万+

T-SQL两个题目

题目 --创建数据库 create database Stores use Stores go --创建供应商表 create table T_suppliers( Supp_code varchar(20) primary key, Supp_name varchar(50) ) select *from T_suppliers --创建商品表 create table T_goods( Goods_id int identity(1,1) primary key, Goods_Name varch

qq_50991473的博客 1186

SQL练习题和答案(难度★★★☆☆)

第二天 1、查询客户表,统计每个机构2000年之前开户数、2000~2005开户数(含头不含尾)、2005~2010开户数(含头不含尾)、2010之后开户数 展示字段:机构号、2000年之前开户数、2000~2005年开户数、2005~2010年开户数、2010年之后开户数 2、查询客户表,按年份统计,每年、每个机构开户数占全年开户数的占比 展示字段:年份、机构号、开户数、开户占比百分比(百分比) 3、统计所有客户的客户号、存款账户数、2011.12.31日的存款余额、2011.12存款月日均、贷款账户数、2011.12.31日的贷款余额、2011.12贷款月日均 备注:null置为0 第三天 1、统计所有客户的2011.12.31日的存款余额、存款比上日余额、存款比上月余额、、存款比上年余额 备注:存款比上日余额 = 2011.12.31日的存款余额-2011.12.30日的存款余额 存款比上月余额 = 2011.12.31日的存款余额-2011.11.30日的存款余额 存款比上年余额 = 2011.12.31日的存款余额-2010.12.31日的存款余额 只有2011.12.31这个日期可以写死,其他日期要通过2011.12.31这个日期来生成。 2、统计所有2011年存款年日均大于100的客户号、客户名称、存款账户数、2011年年日均 第四天 1、统计所有2011年存款年日均和2011年贷款年日均都大于100的客户号、存款账户数、2011年存款年日均、贷款账户数、2011年贷款年日均 2、统计所有客户的客户号、 存款标志(有存款账户的客户置为1、没存款账户的客户置为0)、 贷款标志(有贷款借据的客户置为1、没贷款借据的客户置为0)、 存款质量分类(2011年存款年日均>=10000置为优质、2011年存款年日均>=1000<10000 置为良好、2011年存款年日均=10000置为优质、2011年贷款年日均>=1000<10000 置为良好、2011年贷款年日均<1000置为普通)、 2011年贷款年日均 第五天 1、根据《事件表.xlsx》来建表,然后将excel中的数据导入到目标表中 2、根据客户表、存款信息表、事件表,统计每个客户2017年的客户号、 交易账户数(客户下有多少个账户有交易就是多少)、 当年有交易的天数(如果2017年有5天有过交易,则有交易天数为5)、 当年有交易总月数(如果2017的1、3、5月有交易,则有交易总月数为3)、 最大的月交易总金额(按月统计交易金额,存放最大的月交易金额)、 最大月交易金额的月份(按月统计交易金额,存放交易金额最大的月份)、 年总交易金额、 年交易金额排名(按客户排名,如果总交易金额为0,则不参与排名,排名置为9999)、 年总手续费、 年总手续费排名(按客户排名,如果总手续费为0,则不参与排名,排名置为9999)

SQL面试常见题目

SQL面试常见题目涉及多个方面,包括数据查询、数据操作、表的设计与优化等。

警警的博客 3690

经典SQL语句50题

一个项目涉及到50个SQL语句。(经典)

一些常用的sql语句练习题目及答案

[PS]本人从网上找到的一些面试sql题目,如有不足之处,敬请谅解,可以先拷贝建表语句sql来进行建表,再尝试做一下题目。 建表sql语句: create table student( sno varchar(10) primary key, sname varchar(20), sage int(2), ssex varchar(5) ); create table teacher( t...

qq_37730370的博客 2166

Day470&471.Netty概述&Netty高性能架构设计 -netty

Netty概述 一、原生 NIO 存在的问题 NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。 JDK NIO

阿昌爱Java 1571

FFTW库安装与使用(3.3.5版本)

FFTW库安装与使用一、FFTW库介绍与下载二、FFTW库安装三、FFTW库测试 一、FFTW库介绍与下载   FFTW ( the Faster Fourier Transform in the West) 是一个快速计算离散傅里叶变换的标准C语言程序集,其由MIT的M.Frigo 和S. Johnson 开发。可计算一维或多维实和复数据以及任意规模的DFT,且运行速度比Eigen和opencv自带的FFT库函数快10倍以上。   下载链接:http://www.fftw.org/install/wind

Jhon_ranble的博客 2万+

SQL题目进阶

​ 在学习过SQL语法基础和SQL语句练习后,接下来可以继续通过Leetcode上的SQL题目进行进阶。

qq_63353796的博客 722

K-GAS解读(08)

大众kgas标准,大众及其供应商kgas

m0_51113317的博客 598

45道SQL题目

【代码】45道SQL题目。

m0_60529319的博客 2951

大数据领域数据建模的多源数据融合技术

在大数据时代,数据来源呈现出多样化的特点,包括企业内部的不同业务系统数据、外部的社交媒体数据、传感器数据等。这些多源数据蕴含着丰富的信息,但由于数据格式、语义、质量等方面的差异,难以直接进行分析和利用。多源数据融合技术的目的就是将这些来自不同数据源的数据进行整合、清洗、关联和统一,构建一个具有一致性和完整性的数据模型,以便更好地挖掘数据背后的价值,为企业决策、科学研究等提供有力支持。

Java大师兄的博客 1305

PowerBuilder 9.0安装组件全解析:Adaptive Server Anywhere、PowerDynamo、InfoMaker到底怎么选?

本文从技术架构师视角详细解析PowerBuilder 9.0安装组件选型策略,包括Adaptive Server Anywhere、PowerDynamo和InfoMaker的核心功能与应用场景。通过分析组件间的依赖关系和安装冲突机制,提供针对不同开发需求的最佳安装方案,帮助开发者高效配置PB9.0开发环境。

weixin_28700593的博客 441

leetcode SQL题目

175.组合两个表 左连接 select Person.FirstName, Person.LastName, Address.City, Address.State from Person left join Address on Person.PersonId = Address.PersonId 176.第二高的薪水 先选出最大的,再选出第二大的 SELECT MAX(Salary) Se...

aikudexue的博客 3273

数据中心机房建设标准及依据

深刻理解、尊重并恪守这些依据,是我们以科学、经济、可靠的方式,为蓬勃发展的数字经济筑牢基石的唯一路径。让我们共同努力,以标准为依据,以匠心为精神,建造更多世界一流的高效能、高可用、高智能的绿色数据中心,共同赋能数字中国的宏伟事业,支撑中华民族在数字时代的伟大复兴征程中稳步前行!今天我将力图以宏大的视角和深入的剖析,系统性地阐述数据中心机房建设所应遵循的多层次、多维度的标准依据,揭示这些依据背后的深层逻辑与时代使命,并探讨其如何共同作用于一座世界级数据中心的诞生。,以支持万兆乃至更高速率的传输。

qq_39980997的博客 1139
上一篇: 一个故事告诉你DB2各版本的用途和区别
下一篇: 应遵循的PL/SQL编码规则 (作者:Steven Feuerstein)
cuishuobi4947
博客等级 码龄11年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值