SQL 查询最新套餐用户

问题需求:

在数据库中,以时间为维度查询出移动客户最新开通的套餐。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

思路:

查询出号码对应最新的更改套餐的时间,然后在通过条件匹配查询出该用户最新的套餐。

第一步:

查询出用户最新一次更改套餐的时间,查询以用户作为分组,选出时间最新的(最大)的时间。

select msisdn , MAX(time) from b GROUP BY msisdn

第二步:

以此作为条件来匹配原始表B中的数据,通过左连接或者右连接来匹配查询。

select a.msisdn ,  a.time , b.tariff_packages from B                                --查询a.表中的用户,a.表中的时间,b表中的套餐
RIGHT JOIN                                                                                            --右连接查询
(select msisdn , MAX(time) as time from b GROUP BY msisdn) a         --将刚刚查询到的结果命名为表a
on (B.msisdn = a.msisdn and B.time = a.time)                                        --匹配条件是两个表的用户和时间都能匹配上的结果才输出

注意:在连接查询中需要注明被查询的字段是来自哪一张表的,不然会出现查询时候的报错,报错内容是XXX字段不知来源那张表 ,只需要标明清楚即可解决。

输出的结果:

用户135002当前最新在使用的套餐是B

用户135001当前最新在使用的套餐是A

用户135003当前最新在使用的套餐是C

备注:原表中的部分数据并不是按照时间顺序进行插入的,在实际应用中,可能存在某一天的数据丢失过几天才补上的情况,

所以会出现部分数据的时间插入的先后顺序不一致的情况,但是并不会查询的效果。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

附1:表结构以及注释

表B

字段                           类型           注释

msisdn                       int              用户号码

time                           int              时间(方便计算 用int类型作为比较)

tariff_packages         varchar      修改后的套餐类型

附2:插入语句代码

insert into b (msisdn , time , tariff_packages) VALUES (135001,20180101,‘A‘);
insert into b (msisdn , time , tariff_packages) VALUES (135002,20180123,‘C‘);
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180123,‘A‘);
insert into b (msisdn , time , tariff_packages) VALUES (135001,20180317,‘C‘);
insert into b (msisdn , time , tariff_packages) VALUES (135002,20180415,‘B‘);
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180418,‘B‘);
insert into b (msisdn , time , tariff_packages) VALUES (135002,20180419,‘B‘);
insert into b (msisdn , time , tariff_packages) VALUES (135001,20180518,‘B‘);
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180619,‘C‘);
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180711,‘C‘);
insert into b (msisdn , time , tariff_packages) VALUES (135001,20180712,‘A‘);
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180718,‘B‘);
insert into b (msisdn , time , tariff_packages) VALUES (135002,20180102,‘C‘);
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180801,‘C‘);
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180730,‘A‘);

原文地址:https://www.cnblogs.com/qinfangzhe/p/9349567.html

时间: 2024-11-09 05:49:37

SQL 查询最新套餐用户的相关文章

oracle新建用户执行sql查询语句出现错误ORA-00942:表或视图不存在

oracle创建新用户后客户端执行SQL查询后出现错误提示如下: 执行查询语句如下: select * from sm_sales_order; ORA-00942:表或视图不存在 创建新用户并指定表空间和临时表空间 CREATE USER xxx IDENTIFIED BY xxxx DEFAULT TABLESPACE LMS TEMPORARY TABLESPACE TEMP; 授予系统权限connect grant connect to xxx; 授予对象权限,只限查询 grant se

mysql经纬度查询并且计算2KM范围内附近用户的sql查询性能优化实例教程

之前很傻很天真地以为无非就是逐个计算距离,然后比较出来就行了,然后当碰到访问用户很多,而且数据库中经纬度信息很多的时候,计算量的迅速增长,能让服务器完全傻逼掉,还是老前辈的经验比我们丰富,给了我很大的启示. MySQL性能调优 – 使用更为快速的算法进行距离计算 最近遇到了一个问题,通过不断的尝试最终将某句原本占据近1秒的查询优化到了0.01秒,效率提高了100倍. 问题是这样的,有一张存放用户居住地点经纬度信息的MySQL数据表,表结构可以简化 为:id(int),longitude(long

关于自定义函数导致SQL查询过慢的解决方案

在做报表的过程中,有一张报表是要查询对应币种的汇率,而汇率在另外一张表中,而查询汇率的条件是根据报表的统计日期(页面传入的参数),去汇率表中查询该统计日期的上一个月的汇率,如果没有上个月的汇率,则查询最新的对应币种的汇率,因此,自定义了一个获取汇率的函数,放在SQL中,其传入的参数为对应的币种代码和统计日期,这样,此函数就没有办法建立函数索引,这样导致查询结果很慢,150万的数据导出要10多分钟. 后来做了改进,由于统计日期确定后,其对应的汇率也就确定了,因此另建一张汇率表,其存的汇率就是我们想

Hibernate 关于执行sql查询语句(转)

原文  http://www.yshjava.cn/post/543.html 主题 SQLHibernate Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的.通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类--SQLQueryImpl对象,在下文中出现的SQLQuery如非注明,都是指该子类)对象来进行原生SQL查询: session.creat

SQL Server 2005 控制用户权限访问表

转自:http://www.cnblogs.com/gaizai/archive/2011/07/14/2106617.html 一.需求 在管理数据库过程中,我们经常需要控制某个用户访问数据库的权限,比如只需要给这个用户访问某个表的权限,甚至是CRUD的权限,更小粒度的还可以去到某几个字段的访问权限.写这篇文章就是说明下这个操作过程. 其实这只是SQL Server权限管理很简单的一小块,有些地方并没有深入理解和讲述,只是希望对一些刚入门的童鞋有帮助,其它大侠就当是:我当堂吓一跳,然后得啖笑.

sql:查询创建表的结构

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

Sql Server 优化 SQL 查询:如何写出高性能SQL语句

1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 “全表扫描”方式. 可见,执行计划并不是固定的,它是“个性化的”.产生一个正确的“执行计划”有两点很重要: (1)    SQL语句是否清晰地告诉查询优化器它想干什么? (2)

将Sql查询语句获取的数据插入到List列表里面

Sql查询语句获取的数据是分格式的,我们还用SqlDataReader来做,然后用IDataReader来接收读取,以下是代码: //我想查询一个用户表的信息,该用户有姓名,密码,信息三列 //1.定义一个用户类型的List数组,userInfo类的代码在下方 List<userInfo> userInfo = new List<userInfo>(); //2.我们要读取查询语句的数据,并且保存了.这里我们将使用IDataReader语句 //数据库类的实例,类的代码在下方 DB

SQL查询入门(上篇)

引言 SQL语言是一门简单易学却又功能强大的语言,它能让你快速上手并写出比较复杂的查询语句.但对于大多数开发者来说,使用SQL查询数据库并没有一个抽象的过程和一个合理的步骤,这很可能会使在写一些特定的SQL查询语句来解决特定问题时被"卡"住,本系列文章主要讲述SQL查询时一些基本的理论,以及写查询语句的抽象思路. SQL查询简介 SQL语言起源于1970年E.J.Codd发表的关系数据库理论,所以SQL是为关系数据库服务的.而对于SQL查询,是指从数据库中取得数据的子集,这句话貌似听着