栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

SQL问题-计算最大天数顺序

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SQL问题-计算最大天数顺序

最短的另一种方法是进行自我联接:

with grouped_result as(    select        sr.d,       sum((fr.d is null)::int) over(order by sr.d) as group_number    from tbl sr    left join tbl fr on sr.d = fr.d + interval '1 day')select d, group_number, count(d) over m as consecutive_daysfrom grouped_resultwindow m as (partition by group_number)

输出:

          d          | group_number | consecutive_days ---------------------+--------------+------------------ 2012-04-28 08:00:00 | 1 |     3 2012-04-29 08:00:00 | 1 |     3 2012-04-30 08:00:00 | 1 |     3 2012-05-03 08:00:00 | 2 |     2 2012-05-04 08:00:00 | 2 |     2(5 rows)

实时测试:http://www.sqlfiddle.com/#!1/93789/1

SR =第二行,FR
=第一行(或者前一行?銉)。基本上,我们正在执行向后跟踪,这是数据库不支持的模拟滞后

LAG
(Postgres支持LAG,但解决方案很长,因为窗口不支持嵌套窗口)。因此,在此查询中,我们使用混合方法,通过联接模拟LAG,然后对其使用SUM窗口化,从而产生组号

更新

忘记了最终查询,上面的查询说明了组编号的基础,需要将其变形为:

with grouped_result as(    select        sr.d,       sum((fr.d is null)::int) over(order by sr.d) as group_number    from tbl sr    left join tbl fr on sr.d = fr.d + interval '1 day')select min(d) as starting_date, max(d) as end_date, count(d) as consecutive_daysfrom grouped_resultgroup by group_number-- order by consecutive_days desc limit 1STARTING_DATE     END_DATE          CONSECUTIVE_DAYSApril, 28 2012 08:00:00-0700 April, 30 2012 08:00:00-0700 3May, 03 2012 08:00:00-0700   May, 04 2012 08:00:00-0700   2

更新

我知道为什么我的其他使用窗口函数的解决方案变长了,为什么我试图说明组编号和对组进行计数的逻辑又变长了。如果我像MySql方法那样追求目标,那么该窗口函数可能会更短。话虽如此,这是我以前的窗口函数方法,尽管现在更好:

with headers as(    select       d,lag(d) over m is null or d - lag(d) over m  <> interval '1 day' as header    from tbl    window m as (order by d))      ,sequence_group as(    select d, sum(header::int) over (order by d) as group_number    from headers  )select min(d) as starting_date,max(d) as ending_date,count(d) as consecutive_daysfrom sequence_groupgroup by group_number-- order by consecutive_days desc limit 1

实时测试:http://www.sqlfiddle.com/#!1/93789/21



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/634654.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号