SQL解决数值间隔问题

Posted vansky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL解决数值间隔问题相关的知识,希望对你有一定的参考价值。

 

有表格存放每个顾客拥有的票。现在想查看哪些顾客的票不是连号,即有间隔。并找出间隔的开始与结束数字。
create table tickets (
buyer_name char(5) not null,
ticket_nbr int default 1 not null
check (ticket_nbr>0),
primary key (buyer_name,ticket_nbr)
)
insert into tickets values(‘one‘,2),(‘one‘,3),(‘one‘,4),(‘two‘,4),(‘three‘,1),(‘three‘,2),(‘three‘,3),(‘three‘,5)
,(‘four‘,1),(‘four‘,6),(‘four‘,7),(‘four‘,9),(‘five‘,10),(‘five‘,1)
解惑1:
 
select t.buyer_name from tickets t group by t.buyer_name having not (max(t.ticket_nbr)-min(t.ticket_nbr)<=count(*))
解惑2:
如果ticket中的数字跨越范围不是特别大,则可以 使用序列表,把min(seq)到max(seq)存到表sequence(seq int)表中,找出各顾客在最大值和最小值之间的序列内存在于sequence表中的数字。
解惑3:
创建视图,给每个顾客的票从小到大给出一个序号。对比上下两个号码的值,如果之间的差的绝对值部位1说明他们之间不连续。
create view tickets_v(buyer_name,ticket_nbr,ord) as 
(select  t.buyer_name,t.ticket_nbr,rank() over ( partition by buyer_name order by ticket_nbr ) as ord from tickets  t)
select t1.buyer_name, t1.ticket_nbr+1 as start_nbr,t2.ticket_nbr-1 end_nbr from tickets_v t1,tickets_v t2 where t1.buyer_name=t2.buyer_name and  t1.ord=t2.ord-1  and abs(t1.ticket_nbr-t2.ticket_nbr)<>1

以上是关于SQL解决数值间隔问题的主要内容,如果未能解决你的问题,请参考以下文章

对数间隔的整数

(3.16)SQL语句中所有有关日期 时间的用法

R语言将连续数值转换为自定义间隔的离散类型数据(分类型标称型)实战: 自定义间隔的数据分箱

spark sql日期间隔sql查询不起作用

为pyspark数据框中的记录间隔分配一个常数值

如何高效地使用 SQL 检索半小时间隔的数据?