前几天有个朋友问了一个关于连续时间统计的问题,使用Power Query for Excel来解决的。今天在张俊红老师的公众号上看到了使用使用SQL来解决连续时间的统计问题。这个问题是一个非常经典的例子,在许多的编程的案例甚至面试中都会遇到。关于SQL的解决方案与思路,具体可以拜读俊红老师的文章:

文章链接:

张俊红,公众号:俊红的数据分析之路Sql如何统计连续打卡天数

这类连续的问题主要是有连续打卡时间,连续登陆时间统计,连续迟到时间统计、连续购买、连续乘坐、连续感染新冠病毒、连续服务时间等。

今天来讲的是与俊红老师的文章的题目稍微有所不同,但是都是属于同一类问题。将左侧的数据处理成右侧的数据。即计算每个车队每个对应的各个自编号的车辆的停机的开始日期与结束日期,最后计算停机的天数。

这个问题,我们使用Excel中的Power Query功能来解决。首先,将数据从Excel中加载至Power Query中。修改日期的类型。(如果时间不是顺序的,先对日期进行排序)

其次,使用Table.Group函数的第4个参数的作用,局部分组的作用来进行处理数据。这里先放出M函数的代码看看。

上述公式中最核心的步骤就是"分组"这一步骤。这个步骤里面主要的核心的部分是添加索引列以及判断列。即下面这两分部分代码:添加索引列:

a=Table.AddIndexColumn(_,"index",0,1 )

添加判断列:

 b=Table.AddColumn(a,"判断",       (x)=> x[停机日期]-#duration(x[index],0,0,0))

添加的判断的列的有原理就是比较当前行中的日期与上下两个行中的日期是否连续。然后生成一列日期,最后再使用Table.Group函数的第4个参数为0时(局部分组)对每一个连队下面的自编号的车辆进行分组。

Table.Group(      [        a=Table.AddIndexColumn(_,"index",0,1 ),        b=Table.AddColumn(a,"判断",                  (x)=> x[停机日期]-#duration(x[index],0,0,0))      ]       [b],      "判断",      {          "s",         (y)=>               [                  开始停机日期=List.Min(y[停机日期]),                  结束停机日期=List.Max(y[停机日期]),                  天数=Number.From(结束停机日期-开始停机日期 )+1               ]      }      ,0    )

最后使用List.Max函数与List.Min函数取出最大值与最小值作为开始停机日期与结束停机日期,停机天数是最大日期减去最小日期再加1.

[  开始停机日期=List.Min(y[停机日期]),  结束停机日期=List.Max(y[停机日期]),  天数=Number.From(结束停机日期-开始停机日期 )+1]

对于这个问题,还可以有其他的方法也可以实现这个问题,可以不用在第二个Table.Group函数中使用Table.AddIndexColumns函数(使用List.Positions函数代替)。但是使用到了Table.Group函数的第5个函数,作用是对于分组的条件进行判断。所以整个公式还可以写成:

上面的这个问题还可以再做变形,即要连续的天数在1天以上的(不含1天),这样的问题只需要在最后将天数为1的筛选掉即可。在Excel中对于这类问题的处理,也可以根据上面的思路来使用函数与数据透视表来完成这个问题。如果素材的小伙伴,可以在后台联系小必老师。

sql server计算日期到当前日期天数_Excel如何统计连续停机天数问题相关推荐

  1. sql server 按照日期自动生成单据编号的函数

    一.sql server 按照日期自动生成单据编号的函数,格式为##08080001,##表示打头的单据字符,然后是年月和流水编号. 二.传入的参数为单据的打头字符和生成单据的日期 三.一般的调用格式 ...

  2. sql server根据日期筛选出工作日的数据

    sql server根据日期筛选出工作日的数据 1.如果单纯筛选出除周六和周日的数据 SELECT * FROM 你创建的表 WHERE DATEPART(weekday,字段(日期)) <&g ...

  3. SQL server截取日期,只要年月

    SQL server截取日期,只要年月 select * from 表名 where CONVERT(varchar(7),[Time-列名],120) = CONVERT(varchar(7),'2 ...

  4. SQL SERVER 常用日期计算

    通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天.你们大部分人大概都知道怎样把日期进行分割(年.月.日等),然后仅仅用分割出来的年.月.日等放在几个函 ...

  5. SQL Server各种日期计算方法

    通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天.你们大部分人大概都知道怎样把日期进行分割(年.月.日等),然后仅仅用分割出来的年.月.日等放在几个函 ...

  6. 有关SQL Server中日期的常见问题解答

    介绍 (Introduction) In this article, I compiled a list of FAQs and Answers about dates. 在本文中,我整理了有关日期的 ...

  7. SQL Server 常用日期函数的运用

    1.对SQL Server 日期函数的应用,本文主要的内容是如何获取下面的相关日期 本周星期一 本月第一天 本季度第一天 本年第一天 本周第一天 本月最后一天 本季度最后一天 本年最后一天 本周最后一 ...

  8. 【转】 关于SQL SERVER 2000的一些基本知识(2)——SQL SERVER 2000日期处理

    [转自http://blog.csdn.net/longhorn_fu/archive/2005/09/02/470008.aspx] 日期是数据处理中经常使用到的信息之一.生日.数据处理时间.计划的 ...

  9. SQL Server之日期和时间函数

    返回当前系统日期和时间 Getdate() select Getdate() //结果为:2011-06-17 09:01:00.293 返回表示指定日期的"日"."月& ...

最新文章

  1. varnish 4.0 官方文档翻译12-VCL
  2. 强大的django-debug-toolbar,django项目性能分析工具
  3. Software--Developer Tools_
  4. AM5728通过GPMC接口与FPGA高速数据通信实现
  5. Oracle11g新特性:在线操作功能增强-Oracle11g在线重建索引功能增强 (转载)
  6. Linux常用命令大全(持续更新)
  7. 系统默认声卡驱动没有均衡器的解决方法
  8. 太极图正确画法_八卦太极图的正确画法
  9. excel冻结窗格怎么同时冻结行和列
  10. 需求分析师面试题案例_如何准备作为分析师的业务案例面试
  11. 拳皇中碰撞检测和血量变化的实现
  12. Python操作网页
  13. 半监督学习之伪标签(pseudo label,entropy minimization,self-training)
  14. MyBatis源码的学习(9)---映射器mappers的的XML解析
  15. 业务建模七大关键应用场景
  16. iphone 6plus 输出的屏幕尺寸 375 ,667的原因 - 简书
  17. select下拉框(支持筛选、多选)
  18. MySQL复合索引(联合索引)原理分析及使用
  19. mongodb 基于3千万条数据, 查询30万结果集,分页问题
  20. 微信点赞功能测试用例,面试答题

热门文章

  1. 如何利用java对mysql数据库进行增删改查
  2. [Swift]LeetCode1153. 字符串转化 | String Transforms Into Another String
  3. iOS中 openGL常用函数记录(部分)
  4. PhpStorm之操作数据库
  5. Centos7安装图形桌面
  6. solidity 十六进制字符串转十六进制bytes
  7. hdu 3836 Equivalent Sets
  8. 我的学生时代之一[小学时代]
  9. hdu 1325 Is It A Tree?
  10. 作品展结束了,学习才真正的开始