题目地址

https://www.nowcoder.com/practice/f72d3fc27dc14f3aae76ee9823ccca6b

思路

加了3列标记位,来达成目的。不直观而且占用内存,但是是一种方法。

代码

我的代码,加了3列标记位

# 在不使用SQL过程化编程的情况下,实现一个条件结构:
# 请你筛选表中的数据,当有任意一个0级用户未完成试卷数大于2时,输出每个0级用户的试卷未完成数和未完成率(保留3位小数);若不存在这样的用户,则输出所有有作答记录的用户的这两个指标。结果按未完成率升序排序。 with total_info as( # 先建立一张大宽表
select ui.*,er.exam_id,er.start_time,er.submit_time,er.score
from user_info ui
join exam_record er
on ui.uid=er.uid
)
,
total_ans as # 包含答案的全部信息
(
select ui.uid,ui.level,
(case when t1.incomplete_cnt is null then 0 else t1.incomplete_cnt end) as incomplete_cnt,
(case when t1.exam_record_cnt is null then 0 else t1.exam_record_cnt end) as exam_record_cnt,
(case when t1.incomplete_rate is null then 0.000 else t1.incomplete_rate end) as incomplete_rate # 未完成率默认填0,保留3位小数后是0.000
from user_info ui left join
(select uid,
count((case when submit_time is null then 1 else null end)) as incomplete_cnt,
count(*) as exam_record_cnt,
ROUND(count((case when submit_time is null then 1 else null end))/count(*),3) as incomplete_rate
from total_info
group by uid,level) t1
on t1.uid=ui.uid
)
,
ans_flaged as (
select *,
(case when level=0 then 1 else 0 end) as out1_flag, #如果走条件1,输出out1_flag为1的那些行。
(case when exam_record_cnt>0 then 1 else 0 end) as out2_flag #如果走条件2,输出out2_flag为1的那些行。
,
count(case when level=0 and incomplete_cnt>2 then 1 else null end) over() as if_flag # 每一行的if_flag都是相同的值,如果if_flag>0走条件1,如果if_flag=0走条件2
from total_ans
)
,
ans_to_be_refined as ( # 需要进一步提纯,得到最终结果
select
(case when if_flag>0 and out1_flag=1 then uid
when if_flag=0 and out2_flag=1 then uid
else null
end) as for_null_filter, # 为了之后where过滤使用
uid, incomplete_cnt, incomplete_rate
from ans_flaged
)
select uid, incomplete_cnt, incomplete_rate
from ans_to_be_refined
where for_null_filter is not null
order by incomplete_rate asc

等价的EXISTS代码,别人写的

### 等价的EXISTS代码,别人写的
# select ui.uid,count(*)-count(submit_time) incomplete_cnt,round(1-count(submit_time)/count(*),3) incomplete_rate
# from exam_record er
# left join user_info ui using(uid)
# where level = 0
# group by uid
# order by incomplete_rate -- 第一步 做出所有人的两个指标
with t as
(
select t.uid,level,sum(start_time is not null and submit_time is null) as incomplete_cnt,
round(sum(start_time is not null and submit_time is null)/count(1),3) as incomplete_rate,
count(exam_id) as num
from user_info t
left join exam_record t1 on t.uid = t1.uid
group by t.uid
)
-- 第二步 冲
select uid,incomplete_cnt,incomplete_rate
from t
where EXISTS (
select uid from t where level=0 and incomplete_cnt>2
) and level=0
union ALL
select uid,incomplete_cnt,incomplete_rate
from t
where not EXISTS (
select uid from t where level=0 and incomplete_cnt>2
) and num>0
order by incomplete_rate

在不使用SQL过程化编程的情况下,实现一个条件结构【SQL149 根据指定记录是否存在输出不同情况】的更多相关文章

  1. sql developer Oracle 数据库 用户对象下表及表结构的导入导出

    Oracle数据库表数据及结构的导入导出   导出的主机与即将导入到的目标主机的tablespace 及用户名需一直!!!!!

  2. 从xfire谈WebService接口化编程

    前段时间有博友在看我的博文<WebService入门案例>后,发邮件问我关于WebService 接口在java中的开发,以及在实际生产环境中的应用.想想自己入职也有一段时间了,似乎也该总 ...

  3. DB2开发系列之二——SQL过程

    1.SQL 过程的结构 1)SQL过程的结构 CREATE PROCEDURE proc_name   IN, OUT, INOUT parameters   optional clauses   S ...

  4. SQL Server 深入解析索引存储(下)

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...

  5. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  6. SAS学习笔记之《SAS编程与数据挖掘商业案例》(5)SAS宏语言、SQL过程

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(5)SAS宏语言.SQL过程 1. 一个SAS程序可能包含一个或几个语言成分: DATA步或PROC步 全程语句 SAS组件语言(SCL) ...

  7. 探索GaussDB(DWS)的过程化SQL语言能力

    摘要:在当前GaussDB(DWS)的能力中主要支持两种过程化SQL语言,即基于PostgreSQL的PL/pgSQL以及基于Oracle的PL/SQL.本篇文章我们通过匿名块,函数,存储过程向大家介 ...

  8. 关系数据库SQL之可编程性事务

    前言 前面关系数据库SQL之可编程性函数(用户自定义函数)一文提到关系型数据库提供了可编程性的函数.存储过程.事务.触发器及游标,前文已介绍了函数.存储过程,本文来介绍一下事务的使用.(还是以前面的银 ...

  9. 初探CORBA组件化编程

    1.掌握组件化开发的概念,了解CORBA模型及ORB机制:2.掌握CORBA组件编程方法.二.实验内容(一).步骤1.配制环境JDK环境.2.编写编译IDL接口.3.编写编译服务端程序.4.编写编译客 ...

  10. 关系数据库SQL之可编程性触发器

    前言 前面关系数据库SQL之可编程性函数(用户自定义函数)一文提到关系型数据库提供了可编程性的函数.存储过程.事务.触发器及游标,前文已介绍了函数.存储过程.事务,本文来介绍一下触发器的使用.(还是以 ...

随机推荐

  1. 笛卡尔树 Cartesian tree

    给个板子题 笛卡尔树是这样的一种数据结构:对于 \(n\) 个二元组 \((key, value)\) 形成的笛卡尔树,满足如下性质 其 \(key\) 值满足二叉搜索树性质 (中序排列单调递增),\ ...

  2. 前端面试问题整理(html和css部分)

    html5新增属性有哪些? 如何理解语义化标签? 你如何看待前端模块化的? 如何看待前后端分离? 浏览器兼容性问题? 你知道的行内元素.块级元素有哪些? css部分: 1.为什么要初始化css样式? ...

  3. Java基础|02.方法的传递机制

    Java基础|02.方法传参机制 0x00 前言 Parameter:参数 java中只有传值,因为地址值也是值 0x01 基础数据类型的传参机制 基本数据类型的值传递,不改变原值.因为调用后会弹栈, ...

  4. MQTT服务器搭建——Liunx安装mosquitto,并设置用户密码

    一.安装 1.下载mosquitto安装包 地址:http://mosquitto.org/files/source/ 2.安装依赖包 yum install gcc gcc-c++ libstdc+ ...

  5. EBI数据库下载数据

    EBI网址链接: https://www.ebi.ac.uk 方法:直接从ncbi上面找到想要下载数据的SRR号然后去EBI里面直接搜索即可得到. 底部就是想要下载的fastq文件了: 然后右键复制链 ...

  6. 通过VS Code轻松连接树莓派

    如果您正在使用树莓派作为开发平台,那么通过远程连接VS Code到树莓派是非常方便的一种方法.这样,您可以在Windows或macOS等计算机上开发和测试代码,而不必在树莓派上进行. 以下是通过VS ...

  7. C# 类库 dll 读取配置文件信息

    一:给 C# 类库 dll 添加配置文件并读取配置信息 效果: 1.给类库程序添加配置文件,并命名为:类库名.DLL.config 如上面效果图,类库为:API.dll ,那么其对应的类库配置文件为: ...

  8. 点击按钮触发div颜色改变的几种写法

    目录 JavaScript 行内事件 onclick绑定 关于选取元素 关于改变颜色 addEventListener jQuery 获取元素 绑定事件 设置样式 css() 添加class Vue ...

  9. 转载·Pycharm Pro“This license 56ZS5PQ1RF has been cancelled” 激活码失效处理记录

    今天打开许久没用的Pycharm提示激活码过期,激活提示:"This license 56ZS5PQ1RF has been cancelled" 解决方法如下 首先修改hosts ...

  10. java学习笔记(四)变量

    局部变量,必须声明和初始化值: 实列变量,从属于对象:如果不自行初始化,这个类型的默认值,数值类型,0,0.0  布尔值  默认为false  除了基本类型下,其余的默认值都是null 如 变量类型 ...