SQL面试题:按照时间序列补全数据

简介: HiveSQL面试题,根据时间以最新数据补全字段缺失值

题目:给定表t,字段信息如下

date

c1

c2

c3

2022-09-15

AB

12

bc

2022-09-16


23


2022-09-17



d

2022-09-18

BC



问题:如何补全数据,结果如下

date

c1

c2

c3

2022-09-15

AB

12

bc

2022-09-16

AB

23

bc

2022-09-17

AB

23

d

2022-09-18

BC

23

bc

思路:可以对缺失的数据进行分组,组内累加该字段值,但是目前这题不能使用此方法,因为字段值为含有字符串不能直接累加,可以采用分组之后取第一值。


构造数据:使用SQL先构造上述数据

with t as(selectdate,        c1,        c2,        c3
fromvalues('2022-09-15','AB',12,'bc'),('2022-09-16',null,23,null),('2022-09-17',null,null,'d'),('2022-09-18','BC',null,null)               tmp(date,c1,c2,c3))date        c1  c2  c3
2022-09-15  AB  12  bc
2022-09-16  \N  23  \N
2022-09-17  \N  \N  d
2022-09-18  BC  \N  \N


解法一:分组累加思想

selectdate,    first_value(c1) over(partition by flag1 orderbydate) c1,    first_value(c2) over(partition by flag2 orderbydate) c2,    first_value(c3) over(partition by flag3 orderbydate) c3
from(selectdate,        c1,        c2,        c3,        lag_c1,        lag_c2,        lag_c3,        sum(if(c1 isnotnulland lag_c1 isnull,1,0)) over(orderbydate) flag1,        sum(if((c2 isnotnulland lag_c2 isnull)or(c2 isnotnulland lag_c2 isnotnull),1,0)) over(orderbydate) flag2,        sum(if(c3 isnotnulland lag_c3 isnull,1,0)) over(orderbydate) flag3
from(selectdate,            c1,            c2,            c3,            lag(c1,1) over(orderbydate) lag_c1,            lag(c2,1) over(orderbydate) lag_c2,            lag(c3,1) over(orderbydate) lag_c3
from t
) a
) b
date        c1  c2  c3
2022-09-15  AB  12  bc
2022-09-16  AB  23  bc
2022-09-17  AB  23  d
2022-09-18  BC  23  d

解法二:解法一存在特殊情况,比如c2的连续不为空,分组时就得单独考虑,以下这个方法无需考虑改情况且较为巧妙用count代替sum累加

selectdate,  first_value(c1) over(partition by aa orderbydate)as c1,  first_value(c2) over(partition by bb orderbydate)as c2,  first_value(c3) over(partition by cc orderbydate)as c3
from(selectdate,    c1,    c2,    c3,count(c1) over(orderbydate)as aa,count(c2) over(orderbydate)as bb,count(c3) over(orderbydate)as cc
from t
) a;date        c1  c2  c3
2022-09-15  AB  12  bc
2022-09-16  AB  23  bc
2022-09-17  AB  23  d
2022-09-18  BC  23  d

此题应该还有其他解法,欢迎交流

拜了个拜

目录
相关文章
|
1月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
2月前
|
存储 缓存 关系型数据库
滴滴面试:单表可以存200亿数据吗?单表真的只能存2000W,为什么?
40岁老架构师尼恩在其读者交流群中分享了一系列关于InnoDB B+树索引的面试题及解答。这些问题包括B+树的高度、存储容量、千万级大表的优化、单表数据量限制等。尼恩详细解释了InnoDB的存储结构、B+树的磁盘文件格式、索引数据结构、磁盘I/O次数和耗时,以及Buffer Pool缓存机制对性能的影响。他还提供了实际操作步骤,帮助读者通过元数据找到B+树的高度。尼恩强调,通过系统化的学习和准备,可以大幅提升面试表现,实现“offer直提”。相关资料和PDF可在其公众号【技术自由圈】获取。
|
1月前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
2月前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
288 1
|
2月前
|
SQL 移动开发 Oracle
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
|
2月前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
|
2月前
|
SQL 数据挖掘 数据库
SQL查询每秒的数据:技巧、方法与性能优化
id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言
|
2月前
|
SQL 监控 数据处理
SQL数据库数据修改操作详解
数据库是现代信息系统的重要组成部分,其中SQL(StructuredQueryLanguage)是管理和处理数据库的重要工具之一。在日常的业务运营过程中,数据的准确性和及时性对企业来说至关重要,这就需要掌握如何在数据库中正确地进行数据修改操作。本文将详细介绍在SQL数据库中如何修改数据,帮助读者更好
488 4
|
2月前
|
存储 关系型数据库 MySQL
面试官:MySQL一次到底插入多少条数据合适啊?
本文探讨了数据库插入操作的基础知识、批量插入的优势与挑战,以及如何确定合适的插入数据量。通过面试对话的形式,详细解析了单条插入与批量插入的区别,磁盘I/O、内存使用、事务大小和锁策略等关键因素。最后,结合MyBatis框架,提供了实际应用中的批量插入策略和优化建议。希望读者不仅能掌握技术细节,还能理解背后的原理,从而更好地优化数据库性能。
|
2月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
99 0