网上看的一个SQL需求写的SQL(有点难度哦)

需求如下:
Customer_List    --会员资料表
Customerkey      --会员编码 varchar2 不重复
storeid          --会员所属门店编码 varchar2

customer_consumption --会员消费表 
Customerkey   --会员编码 varchar2
storeid       --会员消费门店编码 varchar2
Createdate    --会员消费日期 Date 

需求:
会员归属门店,默认以第一次消费门店为会员归属门店 
后续会员在最近三个月内连续就餐次数最高的门店,自动设为会员资料的归属门店
如果最高就餐次数不够4次(含4次) 以上的 ,不予以处理

注意点:
1. 最近三个月内连续就餐次数最高

2. 最高就餐次数不够4次(含4次) 以上的 ,不予以处理


分许:1 把最近三个月的消费记录完全取出来 ( 这边还要确定下   比如 5月2 号的记录   这里是指 3  4  5 ? 还要  2月2号到5月2号 )?

               (题外话  如果是消费记录的 前三个月,那难度又添加了,如:现在 系统时间是 9月3日, 单现在要录入 8月3号的数据, 前3月就是 6 月, 7 月, 还有8 月)

           2  明显的就是取出最值, 再在最值上面过滤 。。。


分析到这两点 差不多了,

1  制作数据:

     with  tab1 as(
 select 'customer001' Customerkey , 'story002' storeid , to_date('2015-04-21 12:29:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
 union all
 select 'customer001' Customerkey , 'story002' storeid , to_date('2015-05-21 17:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
  union all
 select 'customer001' Customerkey , 'story002' storeid , to_date('2015-06-11 19:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
 union all
  select 'customer001' Customerkey , 'story001' storeid , to_date('2015-07-21 12:29:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
 union all
 select 'customer001' Customerkey , 'story002' storeid , to_date('2015-04-28 17:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
  union all
 select 'customer001' Customerkey , 'story002' storeid , to_date('2015-07-01 19:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
 union all
  select 'customer002' Customerkey , 'story001' storeid , to_date('2015-04-21 12:29:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
 union all
 select 'customer002' Customerkey , 'story002' storeid , to_date('2015-04-21 17:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
  union all
 select 'customer002' Customerkey , 'story002' storeid , to_date('2015-04-11 19:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
  union all
  select 'customer002' Customerkey , 'story001' storeid , to_date('2015-04-06 12:29:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
 union all
 select 'customer002' Customerkey , 'story002' storeid , to_date('2015-04-03 17:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
  union all
 select 'customer002' Customerkey , 'story002' storeid , to_date('2015-08-04 19:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
)

2 统计客户在店中的消费记录

   tab2 as (
 select  customerkey, storeid,  count(*) cnt   from  tab1 group by Customerkey,storeid 
 )  

3  获取最值 

  tab2 as (
 select  customerkey, storeid,  count(*) cnt , max( count(*) ) over(partition by customerkey)  mx  from  tab1 group by Customerkey,storeid 
 ) select tab2.* from tab2;

 注意:  max( count(*) ) over(partition by customerkey) mx  的意思是: 客户在哪个店中的消费记录最多。 

  截图: 


这个表面 001 用户在  002店中 消费到5次... 符合要求。

最后的SQL  :

 
with  tab1 as(
 select 'customer001' Customerkey , 'story002' storeid , to_date('2015-04-21 12:29:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
 union all
 select 'customer001' Customerkey , 'story002' storeid , to_date('2015-05-21 17:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
  union all
 select 'customer001' Customerkey , 'story002' storeid , to_date('2015-06-11 19:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
 union all
  select 'customer001' Customerkey , 'story001' storeid , to_date('2015-07-21 12:29:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
 union all
 select 'customer001' Customerkey , 'story002' storeid , to_date('2015-04-28 17:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
  union all
 select 'customer001' Customerkey , 'story002' storeid , to_date('2015-07-01 19:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
 union all
  select 'customer002' Customerkey , 'story001' storeid , to_date('2015-04-21 12:29:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
 union all
 select 'customer002' Customerkey , 'story002' storeid , to_date('2015-04-21 17:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
  union all
 select 'customer002' Customerkey , 'story002' storeid , to_date('2015-04-11 19:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
  union all
  select 'customer002' Customerkey , 'story001' storeid , to_date('2015-04-06 12:29:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
 union all
 select 'customer002' Customerkey , 'story002' storeid , to_date('2015-04-03 17:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
  union all
 select 'customer002' Customerkey , 'story002' storeid , to_date('2015-08-04 19:00:19','yyyy-mm-dd hh24:mi:ss') Createdate from dual
),
 tab2 as (
 select  customerkey, storeid,  count(*) cnt , max( count(*) ) over(partition by customerkey) mx  from  tab1 group by Customerkey,storeid 
  having count(*)>4
 ) select tab2.* from tab2 where cnt = mx ;

 

说明: tab1  中全是 满足最近3个月的数据, 加入到项目中 自己在表中刷选即可, 另外这个题目要求是更改 会员的归属店, 这个可以过程在数据库中跑, 根据那个SQL 中店编号, 核对会员的归属店编号, 改动.... 这个这里不写了就,  也可以用merger into 来改, merger into 全表比对, 根据实际的情况取舍。 个人倾向于第一个过程。 

最后的结果是: 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
院 系:软 件 学 院 实验课程:软件工程 实验项目:《餐饮管理系统》需求分析说明书 指导老师:庞雄文 开课时间:2012 ~ 2013年度第 1学期 专 业:软件工程(数字媒体) 班 级:2010级7,8班 学 生:邓润锋 何嘉妮 余晶晶 学 号:20102003007 20102003009 20102003066 华南师范大学教务处 需求分析规格说明书 1. 引言 ................................................................................................................................. 3 1.1. 编目的................................................................................................................... 3 1.2. 背景........................................................................................................................... 3 1.3. 定义........................................................................................................................... 4 1.4. 参考资料 ................................................................................................................... 4 2. 任务概述 ......................................................................................................................... 5 2.1. 目标........................................................................................................................... 5 2.1.1. 总体目标 ........................................................................................................ 5 2.1.2. 概要目标 ........................................................................................................ 5 2.1.3. 系统结构 ........................................................................................................ 5 2.2. 用户特点 ................................................................................................................... 6 2.3. 假定和约束 ............................................................................................................... 7 3. 需求设计 ......................................................................................................................... 7 3.1. 系统详细设计 ...............................................................................................
需求分析可能是软件开发中难度最高的工作,如何能全面准确把握客户的需求,是我们的最大挑战。不好的设计,导致编码工作量剧增不用说,还有一堆质量隐患,面对需求变化时更加是束手无策。“面向对象设计(OOD)”这概念被吹嘘得很玄乎,也出现了不少号称“面向对象”但又不能解决具体问题的设计。 本课程将介绍如何应用UML(统一建模语言)来应对这些挑战,系统地讲解如何理解和分析需求、如何进行架构设计、实体类设计、详细设计等,让学员学会如何做出“为客户带来价值”的软件,做出“高性价比”的设计。 特别说明 本课程是“活用UML-需求分析高手”和“活用UML-软件设计高手”这两个课程的“合并”版本,原来两个课程的上课时间分别为2天、3天,而本课程只需要3天。 如果你时间有限,想在短时间内领悟由需求到设计整个过程如何活用UML,建议你考虑本课程。如果你时间充裕,想充分学习,建议你分别学习“活用UML-需求分析高手”和“活用UML-软件设计高手”课程。 讲师介绍 讲师有近十年的应用UML进行需求分析和软件设计的经验,曾主持和指导多个大型项目的需求分析及软件设计工作,对需求分析和软件设计有独到的理解。同时讲师有多年的授课经验,讲课深入浅出,注重引导学员思考,通过大量的实例让学员掌握知识。讲师是每日培训缔造者,是讲师的训练师。 课程特点 1.将UML知识融汇中具体的实例中,而不会单调地讲UML语法。 2.案例一个一个,学员需分组讨论和思考。 3.讲师会布置课后作业以及给出工作指导,以巩固培训效果,保证学员的收益。 课程目标 1. 掌握类图、活动图、序列图、状态机图、用例图、部署图、组件图、包图、协作图、时间图。 2. 学会用类图、活动图、序列图来分析和重组客户的业务。 3. 学会用用例图、用例表来描述客户的需求。 4. 学会“理解需求、预测变化”,理解需求驱动设计。 5. 学会用部署图、组件图、包图进行架构设计。 6. 学会用类图、包图、序列图、活动图、状态机图深化设计。 7. 学会如何做出“高性价比”的设计。 适合听众 项目经理、系统分析师、需求分析人士、软件设计师、开发人员、测试人员、实施工程师、有一定编程经验并且对UML感兴趣的人士
一、简介 1.1前言 1、由于最近工作一直用Oracle,故对Oracle数据库研究为对象。 2、根据工作业务需求实际情况进行功能研发。为什么要开发呢?因为在数据库升级或者迁移的时候,为了保证不同环境不同数据库数据保持同步,故数据库SQL脚本非常作用。比如:数据库主脚本,副脚本,增量脚本。 3、 什么是主脚本、副脚本、增量脚本呢? 3.1、主脚本指数据库表或存储过程,视图脚本,序列等脚本。 3.2、副脚本指必须执行主脚本之后才执行的脚本。换句话说在没执行主键脚本的情况下,副脚本执行之后会回滚事务失败。 3.3、增量脚本指在执行主脚本或副脚本之后,根据需求对某个表添加/修改约束(主外键约束,长度约束等),添加/修改字段/添加数据等情况对数据库结构改变处理的一种行为脚本。 1.2作用 1、 快速产出自定义规则需要的SQL脚本。 2、减少人工编SQL脚本出错率问题,完全通过程序检测SQL准确性。 3、帮助开发人员提高SQL效率,减少人工编SQL开发成本问题。 4、帮助开发人员节约时间,同时避免繁琐不必要编SQL的工作。 二、实现方式与原理 2.1实现方式 1、实现方式分:正向与逆向实现。什么是正向与逆行呢【是否有鸡还是有蛋,先后道理同等】 2、正向方式:首先把设计好数据库表文档,把所有表的字段属性配置到EXCEL或者CSV格式的文件通过JXL/POI技术去读取文件的字段,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 3、逆向方式:首先有数据库表,然后通过ORM持久化技术连接数据库再读取表的字段等属性出来,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 2.2原理 对数据库软件内置核心表或视图查询出来存储用户行为表结构所有属性信息,对此属性结构信息进行分析与组装所需要SQL脚本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值