ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 1190|回复: 10

[SQL] 求一个SQL,想要的结果是,每个会员,每种购买日期取一个最后日期,和标志。

[复制链接]
认证徽章
论坛徽章:
15
ERP板块每日发贴之星
日期:2007-08-24 01:03:56狮子座
日期:2015-09-10 09:07:23处女座
日期:2015-09-11 10:28:03ITPUB14周年纪念章
日期:2015-10-26 17:23:44喜羊羊
日期:2015-06-24 14:33:00慢羊羊
日期:2015-06-15 14:22:442015年新春福章
日期:2015-03-12 17:22:46优秀写手
日期:2014-11-20 06:00:13茶鸡蛋
日期:2013-06-29 22:37:49蛋疼蛋
日期:2013-04-27 10:34:16
发表于 2017-11-24 15:26 | 显示全部楼层 |阅读模式
本帖最后由 test_100 于 2017-11-24 15:51 编辑
  1.   With a As
  2.    (Select 1001 cst_id,
  3.            to_date('2014/09/29', 'yyyy-mm-dd') pur_dt,
  4.            1 cst_working_flag,
  5.            to_date('2014/09/29', 'yyyy-mm-dd') cst_working_dt,
  6.            Null cst_holiday_flag,
  7.            Null cst_holiday_dt
  8.       From dual
  9.     Union All
  10.     Select 1001 cst_id,
  11.            to_date('2014/09/29', 'yyyy-mm-dd') pur_dt,
  12.            1 cst_working_flag,
  13.            to_date('2014/09/29', 'yyyy-mm-dd') cst_working_dt,
  14.            Null cst_holiday_flag,
  15.            Null cst_holiday_dt
  16.       From dual
  17.     Union All
  18.     Select 1001 cst_id,
  19.            to_date('2015/03/29', 'yyyy-mm-dd') pur_dt,
  20.            1 cst_working_flag,
  21.            to_date('2015/03/29', 'yyyy-mm-dd') cst_working_dt,
  22.            Null cst_holiday_flag,
  23.            Null cst_holiday_dt
  24.       From dual
  25.     Union All
  26.     Select 1001 cst_id,
  27.            to_date('2015/05/13', 'yyyy-mm-dd') pur_dt,
  28.            Null cst_working_flag,
  29.            Null cst_working_dt,
  30.            1 cst_holiday_flag,
  31.            to_date('2015/05/13', 'yyyy-mm-dd') cst_holiday_dt
  32.       From dual
  33.     Union All
  34.     Select 1001 cst_id,
  35.            to_date('2015/05/14', 'yyyy-mm-dd') pur_dt,
  36.            1 cst_working_flag,
  37.            to_date('2015/05/14', 'yyyy-mm-dd') cst_working_dt,
  38.            1 cst_holiday_flag,
  39.            to_date('2015/05/14', 'yyyy-mm-dd') cst_holiday_dt
  40.       From dual
  41.     Union All
  42.     Select 1002 cst_id,
  43.            to_date('2014/09/29', 'yyyy-mm-dd') pur_dt,
  44.            1 cst_working_flag,
  45.            to_date('2014/09/29', 'yyyy-mm-dd') cst_working_dt,
  46.            Null cst_holiday_flag,
  47.            Null cst_holiday_dt
  48.       From dual
  49.     Union All
  50.     Select 1002 cst_id,
  51.            to_date('2014/09/29', 'yyyy-mm-dd') pur_dt,
  52.            1 cst_working_flag,
  53.            to_date('2014/09/29', 'yyyy-mm-dd') cst_working_dt,
  54.            Null cst_holiday_flag,
  55.            Null cst_holiday_dt
  56.       From dual
  57.     Union All
  58.     Select 1002 cst_id,
  59.            to_date('2015/03/29', 'yyyy-mm-dd') pur_dt,
  60.            1 cst_working_flag,
  61.            to_date('2015/03/29', 'yyyy-mm-dd') cst_working_dt,
  62.            Null cst_holiday_flag,
  63.            Null cst_holiday_dt
  64.       From dual
  65.     Union All
  66.     Select 1002 cst_id,
  67.            to_date('2015/05/13', 'yyyy-mm-dd') pur_dt,
  68.            Null cst_working_flag,
  69.            Null cst_working_dt,
  70.            1 cst_holiday_flag,
  71.            to_date('2015/05/13', 'yyyy-mm-dd') cst_holiday_dt
  72.       From dual
  73.     Union All
  74.     Select 1002 cst_id,
  75.            to_date('2015/05/14', 'yyyy-mm-dd') pur_dt,
  76.            Null cst_working_flag,
  77.            Null cst_working_dt,
  78.            1 cst_holiday_flag,
  79.            to_date('2015/05/14', 'yyyy-mm-dd') cst_holiday_dt
  80.       From dual)
  81.   Select * From a order by a.cst_id asc ,a.pur_dt asc;
复制代码
1. 数据脚本如上,结果如下:
CST_IDPUR_DTCST_WORKING_FLAGCST_WORKING_DTCST_HOLIDAY_FLAGCST_HOLIDAY_DT
10012014/9/2912014/9/29  
10012014/9/2912014/9/29  
10012015/3/2912015/3/29  
10012015/5/13  12015/5/13
10012015/5/1412015/5/1412015/5/14
10022014/9/2912014/9/29  
10022014/9/2912014/9/29  
10022015/3/2912015/3/29  
10022015/5/13  12015/5/13
10022015/5/14  12015/5/14

2. 字段说明,依次是:会员ID;购买日期;是工作日购买为1,否则为NULL;工作日购买日期;是假日购买为1,否则为NULL;假日购买日期。

3. 想要的结果是,每个会员,每种购买日期取一个最后日期,和标志:

  1.   With a As
  2.    (Select 1001 cst_id,
  3.            1 cst_working_flag,
  4.            to_date('2015/05/14', 'yyyy-mm-dd') cst_working_dt,
  5.            1 cst_holiday_flag,
  6.            to_date('2015/05/14', 'yyyy-mm-dd') cst_holiday_dt
  7.       From dual
  8.     Union All
  9.     Select 1002 cst_id,
  10.            1 cst_working_flag,
  11.            to_date('2015/03/29', 'yyyy-mm-dd') cst_working_dt,
  12.            1 cst_holiday_flag,
  13.            to_date('2015/05/14', 'yyyy-mm-dd') cst_holiday_dt
  14.       From dual)
  15.   Select * From a Order By a.cst_id Asc;
复制代码
4. 结果应该是:
CST_IDCST_WORKING_FLAGCST_WORKING_DTCST_HOLIDAY_FLAGCST_HOLIDAY_DT
100112015/5/1412015/5/14
100212015/3/2912015/5/14
5. oracle 数据库,版本是11g;1张表,数据在1000W.
6. 谢谢~


求职 : 数据库开发
论坛徽章:
17
优秀写手
日期:2014-02-27 06:00:13秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26白羊座
日期:2015-10-09 16:42:50
发表于 2017-11-24 16:01 | 显示全部楼层
SELECT CST_ID,
        MAX(DECODE(CST_WORKING_FLAG, 1, CST_WORKING_FLAG)) CST_WORKING_FLAG,
        MAX(DECODE(CST_WORKING_FLAG, 1, CST_WORKING_DT)) CST_WORKING_DT,
        MAX(DECODE(CST_HOLIDAY_FLAG, 1, CST_HOLIDAY_FLAG)) CST_HOLIDAY_FLAG,
        MAX(DECODE(CST_HOLIDAY_FLAG, 1, CST_HOLIDAY_DT)) CST_HOLIDAY_DT
FROM   A
GROUP  BY CST_ID

使用道具 举报

回复
认证徽章
论坛徽章:
15
ERP板块每日发贴之星
日期:2007-08-24 01:03:56狮子座
日期:2015-09-10 09:07:23处女座
日期:2015-09-11 10:28:03ITPUB14周年纪念章
日期:2015-10-26 17:23:44喜羊羊
日期:2015-06-24 14:33:00慢羊羊
日期:2015-06-15 14:22:442015年新春福章
日期:2015-03-12 17:22:46优秀写手
日期:2014-11-20 06:00:13茶鸡蛋
日期:2013-06-29 22:37:49蛋疼蛋
日期:2013-04-27 10:34:16
发表于 2017-11-24 16:19 | 显示全部楼层
本帖最后由 test_100 于 2017-11-24 16:27 编辑
chengccy2010 发表于 2017-11-24 16:01
SELECT CST_ID,
        MAX(DECODE(CST_WORKING_FLAG, 1, CST_WORKING_FLAG)) CST_WORKING_FLAG,
      ...

谢谢,行转列,这种方法可以。有12个字段,不知还有没有其它方法。

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2017-11-26 16:12 | 显示全部楼层
这种方法挺实用的,收集下

使用道具 举报

回复
论坛徽章:
133
秀才
日期:2015-11-12 17:43:40秀才
日期:2016-02-18 09:15:13秀才
日期:2016-02-18 09:21:30秀才
日期:2016-02-18 09:23:46秀才
日期:2016-02-18 09:24:302016猴年福章
日期:2016-02-18 09:31:30秀才
日期:2016-02-18 09:39:10秀才
日期:2016-02-18 10:06:46秀才
日期:2016-02-18 10:08:02秀才
日期:2016-02-18 10:08:14
发表于 2017-11-27 16:25 | 显示全部楼层
select cst_id,      
       max(cst_working_dt) cst_working_dt,
       max(cst_holiday_dt) cst_holiday_dt
  from a
group by cst_id

使用道具 举报

回复
认证徽章
论坛徽章:
15
ERP板块每日发贴之星
日期:2007-08-24 01:03:56狮子座
日期:2015-09-10 09:07:23处女座
日期:2015-09-11 10:28:03ITPUB14周年纪念章
日期:2015-10-26 17:23:44喜羊羊
日期:2015-06-24 14:33:00慢羊羊
日期:2015-06-15 14:22:442015年新春福章
日期:2015-03-12 17:22:46优秀写手
日期:2014-11-20 06:00:13茶鸡蛋
日期:2013-06-29 22:37:49蛋疼蛋
日期:2013-04-27 10:34:16
发表于 2017-11-27 16:40 | 显示全部楼层
visual2006 发表于 2017-11-27 16:25
select cst_id,      
       max(cst_working_dt) cst_working_dt,
       max(cst_holiday_dt) cst_ho ...

                                                   

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
发表于 2017-11-27 22:48 | 显示全部楼层
这个设计很奇怪,pur_dt和后面两个是永远相同的(如果有值的话)?那么只要标志就行了,还要把日期再重复一遍干什么?

使用道具 举报

回复
认证徽章
论坛徽章:
15
ERP板块每日发贴之星
日期:2007-08-24 01:03:56狮子座
日期:2015-09-10 09:07:23处女座
日期:2015-09-11 10:28:03ITPUB14周年纪念章
日期:2015-10-26 17:23:44喜羊羊
日期:2015-06-24 14:33:00慢羊羊
日期:2015-06-15 14:22:442015年新春福章
日期:2015-03-12 17:22:46优秀写手
日期:2014-11-20 06:00:13茶鸡蛋
日期:2013-06-29 22:37:49蛋疼蛋
日期:2013-04-27 10:34:16
发表于 2017-11-28 17:07 | 显示全部楼层
newkid 发表于 2017-11-27 22:48
这个设计很奇怪,pur_dt和后面两个是永远相同的(如果有值的话)?那么只要标志就行了,还要把日期再重复一 ...

举个例子,有一个会员在11月24日(这一天是工作日)购买了商品,这一天此会员的cst_working_flag=1,cst_working_dt=2017-11-24,如果今后(超过1年)这个会员在工作日再没买过商品,此标志cst_working_flag会清空;

当此会员在11月25日(这一天是假日)购买了商品,这一天此会员的cst_holiday_flag=1,cst_holiday_dt=2017-11-25,如果今后(超过1年)这个会员在假日再没买过商品,此标志cst_holiday_flag会清空。

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
发表于 2017-11-28 22:35 | 显示全部楼层
你没明白我的意思。你的标记会被清空,同时相应的日期也被清空。所以要看历史数据找出来。那么只要找到最后购买日期不就相当于找到那两个日期了吗?保存另外那两个日期的意义何在?

使用道具 举报

回复
认证徽章
论坛徽章:
15
ERP板块每日发贴之星
日期:2007-08-24 01:03:56狮子座
日期:2015-09-10 09:07:23处女座
日期:2015-09-11 10:28:03ITPUB14周年纪念章
日期:2015-10-26 17:23:44喜羊羊
日期:2015-06-24 14:33:00慢羊羊
日期:2015-06-15 14:22:442015年新春福章
日期:2015-03-12 17:22:46优秀写手
日期:2014-11-20 06:00:13茶鸡蛋
日期:2013-06-29 22:37:49蛋疼蛋
日期:2013-04-27 10:34:16
发表于 2017-11-30 14:26 | 显示全部楼层
newkid 发表于 2017-11-28 22:35
你没明白我的意思。你的标记会被清空,同时相应的日期也被清空。所以要看历史数据找出来。那么只要找到最后 ...

2017年11月24日,2017年11月25日,2017年11月30日这三天都有购买,事实是2018年11月24日清空上一年同日的标志,2018年11月25日清空上一年同日的标志,2018年11月30日清空上一年同日的标志,和按最后购买日来清空标志不同。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表