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

 找回密码
 注册
查看: 438|回复: 6

[SQL] 如何实现动态分组,求大神指教

[复制链接]
认证徽章
论坛徽章:
0
发表于 2018-4-24 14:24 | 显示全部楼层 |阅读模式
现有数据如下:
WITH t AS (
SELECT 11 Id,'2018-04-01' DateId,300 Amount
  UNION ALL
SELECT 11 Id,'2018-04-02' DateId,200
UNION ALL
SELECT 11 Id,'2018-04-05' DateId,150
UNION ALL
SELECT 11 Id,'2018-04-10' DateId,350
UNION ALL
SELECT 11 Id,'2018-04-12' DateId,400
UNION ALL
SELECT 11 Id,'2018-04-16' DateId,600
UNION ALL
SELECT 11 Id,'2018-04-22' DateId,500
)
SELECT *
   FROM t
希望得到的结果如下:
以最小时间4.1号为起始点,之后的每7天归为一组,当某一行日期超出起始日期+7天,则以该行的日期作为新的起始日期继续
按照举例的数据,分组后,应该是4.1,4.2,4.5三天为一组,4.10,4.12,4.16为一组,4.22为一组,求大神指点sql应该怎么写
论坛徽章:
127
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2018-4-24 14:34 | 显示全部楼层
把希望得到结果贴出来 详细说明一下

使用道具 举报

回复
论坛徽章:
141
秀才
日期:2015-12-14 14:56:092016猴年福章
日期: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秀才
日期:2016-03-01 09:57:08天蝎座
日期:2016-03-18 14:23:56秀才
日期:2016-03-24 09:10:24秀才
日期:2016-03-24 09:20:52
发表于 2018-4-24 15:11 | 显示全部楼层
WITH ttt AS
(SELECT 11 Id, '2018-04-01' DateId, 300 Amount
    from dual
  UNION ALL
  SELECT 11 Id, '2018-04-02' DateId, 200
    from dual
  UNION ALL
  SELECT 11 Id, '2018-04-05' DateId, 150
    from dual
  UNION ALL
  SELECT 11 Id, '2018-04-10' DateId, 350
    from dual
  UNION ALL
  SELECT 11 Id, '2018-04-12' DateId, 400
    from dual
  UNION ALL
  SELECT 11 Id, '2018-04-16' DateId, 600
    from dual
  UNION ALL
  SELECT 11 Id, '2018-04-22' DateId, 500
    from dual)
select g.group_id, t.*
  from ttt t,
       (select group_id, min(fiscal_date) f_date, max(fiscal_date) t_date
          from (select to_date('20180331', 'yyyymmdd') + level fiscal_date,
                       'G' || trunc((level - 1) / 7) group_id
                  from dual
                connect by level < 300)
         group by group_id) g
where to_date(t.dateid, 'yyyy-mm-dd') between g.f_date and g.t_date

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2018-4-24 15:21 | 显示全部楼层
visual2006 发表于 2018-4-24 15:11
WITH ttt AS
(SELECT 11 Id, '2018-04-01' DateId, 300 Amount
    from dual

这样的结果4.10,4.12,4.16是不在一个组内的,我的期望结果是要在同一组

使用道具 举报

回复
论坛徽章:
496
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
发表于 2018-4-24 16:37 | 显示全部楼层
WITH t AS (
SELECT 11 Id,date '2018-04-01' DateId,300 Amount from dual
  UNION ALL
SELECT 11 Id,date '2018-04-02' DateId,200 from dual
UNION ALL
SELECT 11 Id,date '2018-04-05' DateId,150 from dual
UNION ALL
SELECT 11 Id,date '2018-04-10' DateId,350 from dual
UNION ALL
SELECT 11 Id,date '2018-04-12' DateId,400 from dual
UNION ALL
SELECT 11 Id,date '2018-04-16' DateId,600 from dual
UNION ALL
SELECT 11 Id,date '2018-04-22' DateId,500 from dual
)
SELECT *
   FROM t
model return all rows
dimension by (row_number() over(order by dateid) rn)
measures (id,dateid,amount,dateid group_date)
rules (
  group_date[any] order by rn=case when dateid[cv()]<= group_date[cv()-1]+6 then group_date[cv()-1] else dateid[cv()]  end
);

如果12C可以还可以用match_recognize

楼主写完自己的脚本竟然不跑一下?你知道给别人添了多少麻烦?

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2018-4-24 16:45 | 显示全部楼层
newkid 发表于 2018-4-24 16:37
WITH t AS (
SELECT 11 Id,date '2018-04-01' DateId,300 Amount from dual
  UNION ALL

版主息怒,工作电脑没有oracle环境,又找不到mssql的专业论坛,只能来itpub求助拓宽下思路,以后会改正

使用道具 举报

回复
论坛徽章:
399
优秀写手
日期:2013-12-18 09:29:08itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07懒羊羊
日期:2015-02-21 22:03:31懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
发表于 2018-4-25 11:08 来自手机 | 显示全部楼层
装个oracle xe才几百M

使用道具 举报

回复

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

本版积分规则

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