精华内容
下载资源
问答
  • oracle按照日期求连续天数数据sql

    千次阅读 2016-07-25 21:14:04
    /*求出连续三天都符合条件的数据,如果有一天不连续,即不取出*/  SELECT ACCOUNT,OCCUR_DATE,START_DATE,SITE_NO,END_DATE,AMOUNT FROM(  SELECT ACCOUNT,(SELECT DATA_DATE FROM MC_DATA_DATE) OCCUR_DATE,MIN...

    ---原始数据


    -- 以下结果是运行:(将连续的数据通过RN展示表示是一组数据)

     SELECT OCCUR_DATE,SITE_NO,VOUH_NO,ACCOUNT, TRUNC(T.OCCUR_DATE-ROW_NUMBER() OVER(PARTITION BY T.ACCOUNT ORDER BY T.OCCUR_DATE)) RN
           FROM  TEMP_225 T





     /*求出连续三天都符合条件的数据,如果有一天不连续,即不取出*/

    最终语句

     SELECT ACCOUNT,OCCUR_DATE,START_DATE,SITE_NO,END_DATE,AMOUNT,TX_NUM FROM(
       SELECT ACCOUNT,sysdate OCCUR_DATE,MIN(OCCUR_DATE) START_DATE ,MIN(SITE_NO)SITE_NO ,MAX(OCCUR_DATE) END_DATE,TO_NUMBER(SUM(VOUH_NO)) AMOUNT,COUNT(1)TX_NUM FROM (
         
          SELECT OCCUR_DATE,SITE_NO,VOUH_NO,ACCOUNT, TRUNC(T.OCCUR_DATE-ROW_NUMBER() OVER(PARTITION BY T.ACCOUNT ORDER BY T.OCCUR_DATE)) RN
           FROM TEMP_225 T
          )GROUP BY ACCOUNT,RN
      HAVING COUNT(1)>=3
    )


    ----以下结果是运行





     
    展开全文
  • 一、力扣原题:体育馆的人流量 题目来源:力扣(LeetCode) 链接:... 《获取连续登陆天数,连续签到天数 ,方法优化》 文章思路清晰,易懂。认真负责任的程序员GG讲了一个好故事,生动有趣。

    一、力扣原题:体育馆的人流量

    题目来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/human-traffic-of-stadium

    以下是力扣原题:

    X 市建了一个新的体育馆,每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)。

    请编写一个查询语句,找出人流量的高峰期。高峰期时,至少连续三行记录中的人流量不少于100。

    例如,表 stadium:
    在这里插入图片描述
    对于上面的示例数据,输出为:
    在这里插入图片描述
    提示:
    每天只有一行记录,日期随着 id 的增加而增加。

    题解:
    方法:使用 JOINWHERE 子句。
    思路:

    • 在表 stadium 中查询人流量超过 100 的记录,将查询结果与其自身的临时表连接,再使用 WHERE
      子句获得满足条件的记录。

    • a,b 和 c 相同,重点是需要考虑添加哪些条件能够得到想要的结果。以 a为例,它有可能是高峰期的第 1 天,第 2 天,或第
      3 天。

    • 用排列的方式的话有6个条件
      (1、a是高峰期第1天,b是高峰期第2天,c是高峰期第3天;
      2、a是高峰期第1天,b是高峰期第3天,c是高峰期第2天;
      3、a是高峰期第2天,b是高峰期第1天,c是高峰期第3天;
      4、a是高峰期第2天,b是高峰期第3天,c是高峰期第1天;
      5、a是高峰期第3天,b是高峰期第1天,c是高峰期第2天;
      6、a是高峰期第3天,b是高峰期第2天,c是高峰期第1天;)

    根据上面的思路给出SQL语句如下:

    select distinct a.* from stadium a,stadium b,stadium c
    where a.people>=100 and b.people>=100 and c.people>=100
    and ((a.id = b.id - 1 and b.id = c.id - 1) or #(1,2,3)
    (a.id = b.id - 2 and b.id = c.id + 1) or      #(1,3,2)
    (a.id = b.id + 1 and a.id = c.id - 1) or      #(2,1,3)
    (a.id = b.id - 1 and a.id = c.id + 1) or      #(2,3,1)
    (a.id = b.id + 2 and b.id = c.id - 1) or      #(3,1,2)
    (a.id = b.id + 1 and b.id = c.id + 1) )       #(3,2,1)
    

    实际上以上6个条件只需要选择3个(a分别第高峰期第1天,第2天,第3天就行了),上面的sql与下面这个效果一样:

    select distinct a.* from stadium a,stadium b,stadium c
    where a.people>=100 and b.people>=100 and c.people>=100
    and (
         (a.id = b.id-1 and b.id = c.id -1) or   #(1,2,3)
         (a.id = b.id-1 and a.id = c.id +1) or   #(2,3,1)
         (a.id = b.id+1 and b.id = c.id +1)      #(3,2,1)
    ) order by a.id
    

    感兴趣的可以去力扣搜原题进行练习或者查看更多的解题思路。

    二、延伸:连续签到天数计算

    这道题跟连续签到天数计算题的原理相似。假设将求体育馆的人流量超过100的连续日期,换成求连续签到天数,该怎么做呢?
    我的思路:按照上面求出来的结果,继续取max(visit_date)-min(visit_date)+1就是最大连续签到天数了。

    当然,实际工作中,以上题目并不算是一个好的案例。接下来分享几个我平时看到的题和实际案例给大家,最后附上原文,有兴趣可以点击阅读原文。

    这题是从公众号上刷到的,是鹅厂的SQL笔试题。(点击进入原文。

    题目:
    有一张用户签到表【t_user_attendence】,标记每天用户是否签到(说明:该表包含所有用户所有工作日的出勤记录) ,包含三个字段:日期【fdate】,用户id【fuser_id】,用户当天是否签到【fis_sign_in:0否1是】;

    问题1:
    请计算截至当前每个用户已经连续签到的天数(输出表仅包含当天签到的所有用户,计算其连续签到天数)
    输出表【t_user_consecutive_days】:用户id【fuser_id】,用户联系签到天数【fconsecutive_days】

    问题2:
    请计算每个用户历史以来最大的连续签到天数(输出表为用户签到表中所有出现过的用户,计算其历史最大连续签到天数)
    输出表【t_user_max_days】:用户id【fuser_id】,用户最大连续签到天数【fmax_days】
    在这里插入图片描述
    在这里插入图片描述
    还有一个案例是用SQL存储过程解决的。
    《获取连续登陆天数,连续签到天数 ,方法优化》
    文章思路清晰,易懂。认真负责任的程序员GG讲了一个好故事,生动有趣。

    展开全文
  • //以下内容全部原创 , 主要用户获取每日签到记录的最大连续签到天数 和 需要补签的日期(如果不需要补签 把默认补签次数改为0一样适用) //主要目的是用于自己记录一些封装好的方法 和 分享以供大家借鉴。 希望大家...
    //以下内容全部原创 , 主要用户获取每日签到记录的最大连续签到天数 和 需要补签的日期(如果不需要补签 把默认补签次数改为0一样适用)
    //主要目的是用于自己记录一些封装好的方法 和 分享以供大家借鉴。 希望大家能提出优化建议。
    //如若转载 望加来源,谢谢。
    
    //某段时期内的 签到记录   
    $user_qiandao_info = self::getUserGiftDay($uid,  self::$hd_ename,'freegift',$reset_time);  //用于获取用户的签到记录
    $user_qiandao_day = array_column($user_gifts,'addtime');//取数组中的签到日期重新组成数组
    rsort($user_qiandao_day);//倒叙排列
    if(empty($user_qiandao_day[0])){ return array();}  //如果从未签到 则重新开始
    return self::keep_day($user_qiandao_day,$bq_num);  //调用keep_day方法 获取最大连续签到天数(传入签到记录列表 和 默认补签次数)
    
    
    
    public static function keep_day($day_map,$bq_num = 1){  //默认1次补签机会
        $data = array();
        $buqian = array();//补签记录
        $day_map = self::day_map_init($day_map); //调用下面的方法 处理签到记录 , 签到记录日期取整
        $now_time = time();
        $today = date('Y-m-d',$now_time);
        //先查询最后一次签到距当前时间差
        $day_cha = (strtotime($today) - strtotime($day_map[0]))/86400;
        if($day_cha <= 1){
            //不需要消耗补签
        }else{
            if($day_cha > $bq_num + 1){//最大时间差天数为补签次数+1;
                //最后一次签到距今天已超过最大间隔天数 则返回原有数据
                return $data;
            }else{
                //最后一次签到距今天小于等于最大间隔天数,需要补签多少天  依次补签
                for($j = 1;$j < $day_cha;$j++){
                    $bq_num--;
                    $buqian[] = date('Y-m-d',$now_time-86400*$j);//需要补签的日期   当前时间的前一天
                }
            }
        }
        $keep_day = 1;  //默认当前连续1天
        $count = count($day_map);
        if($count <= 1) {  //总共签到记录小于等于1则返回
            $data['keep_day'] =  $keep_day;
            $data['buqian'] =  $buqian;
            return $data;
        }
        //有多条签到记录则继续依次处理
        for($i=0;$i<$count-1;$i++){
            $day_cha = (strtotime($day_map[$i]) - strtotime($day_map[$i+1]))/86400;
            if($day_cha <= 1){
                //连续日期 不需要消耗补签
                $keep_day++;
            }else{
                if($day_cha > $bq_num + 1){
                    //两次签到已超过最大间隔天数 则连续天数到此为止
                    $data['keep_day'] =  $keep_day;
                    $data['buqian'] =  $buqian;
                    return $data;
                }else{
                    //每补签一段时间 登录次数就+1;
                    $keep_day++;
                    //最后一次签到距今天小于等于最大间隔天数,需要补签多天  挨个补签
                    for($j = 1;$j < $day_cha;$j++){
                        $bq_num--;
                        $buqian[] = date('Y-m-d',strtotime($day_map[$i])-86400*$j);//补签 日期 ???补签昨天
                    }
                }
            }
        }
        $data['keep_day'] = $keep_day;
        $data['buqian'] = $buqian;
        return $data;
    }
    
    /**
     * 签到日期 初始化 (日期取整)
     */
    public function day_map_init($day_map){
        foreach($day_map as $k => $v){
            $day_map[$k] = date("Y-m-d",strtotime($v));
        }
        return array_unique($day_map);
    }
    展开全文
  • 一个SQL获取某股票连续上涨的天数

    千次阅读 2020-06-11 21:32:57
    一个SQL获取某股票连续上涨的天数问题思路创建Table插入数据sql1:计算每天的涨跌情况sql2:根据sql1的结果计算连续上涨的时间段 问题 求股票最长连续上涨天数的sql语句 现有表(股价表)、包含三个字段(股票代码...

    1.1 问题

    求解答:股票最长连续上涨天数的sql语句
    现有表(股价表)、包含三个字段(股票代码,收盘价、交易日),写出计算股票最长连续上涨了多少天的sql语句。
    注:后一天收盘价>前一天收盘价即为涨

    现有网上的解答多数是手工拼接数据,这里来个纯正的sql解决方案。

    2.1 思路

    1、获取每天涨跌
    2、计算连续上涨的天数

    知识点:窗口函数(lag)、With as、Join + 递归。
    多思考,多练习求证,才能培养出一定的sql思维。

    3.1 创建Table

    create table test111
    (
    code	varchar2(100),
    stockdate	date,
    close  number
    
    )
    

    3.2 插入数据

    insert into TEST111 (CODE, STOCKDATE, CLOSE, ROWID)
    values ('62', to_date('05-01-2015', 'dd-mm-yyyy'), '8.91', null);
    
    insert into TEST111 (CODE, STOCKDATE, CLOSE, ROWID)
    values ('62', to_date('06-01-2015', 'dd-mm-yyyy'), '8.31', null);
    
    insert into TEST111 (CODE, STOCKDATE, CLOSE, ROWID)
    values ('62', to_date('07-01-2015', 'dd-mm-yyyy'), '8.6', null);
    
    insert into TEST111 (CODE, STOCKDATE, CLOSE, ROWID)
    values ('62', to_date('08-01-2015', 'dd-mm-yyyy'), '8.73', null);
    
    insert into TEST111 (CODE, STOCKDATE, CLOSE, ROWID)
    values ('62', to_date('09-01-2015', 'dd-mm-yyyy'), '8.82', null);
    
    insert into TEST111 (CODE, STOCKDATE, CLOSE, ROWID)
    values ('62', to_date('10-01-2015', 'dd-mm-yyyy'), '8.9', null);
    
    insert into TEST111 (CODE, STOCKDATE, CLOSE, ROWID)
    values ('62', to_date('11-01-2015', 'dd-mm-yyyy'), '9', null);
    
    insert into TEST111 (CODE, STOCKDATE, CLOSE, ROWID)
    values ('62', to_date('12-01-2015', 'dd-mm-yyyy'), '8.5', null);
    
    insert into TEST111 (CODE, STOCKDATE, CLOSE, ROWID)
    values ('62', to_date('13-01-2015', 'dd-mm-yyyy'), '8.6', null);
    
    insert into TEST111 (CODE, STOCKDATE, CLOSE, ROWID)
    values ('62', to_date('14-01-2015', 'dd-mm-yyyy'), '8.7', null);
    
    insert into TEST111 (CODE, STOCKDATE, CLOSE, ROWID)
    values ('62', to_date('15-01-2015', 'dd-mm-yyyy'), '8.5', null);
    
    insert into TEST111 (CODE, STOCKDATE, CLOSE, ROWID)
    values ('62', to_date('16-01-2015', 'dd-mm-yyyy'), '8.5', null);
    commit;
    

    原始数据

    3.3 sql1:计算每天的涨跌情况

    with xh as
     (select t.code,
             t.stockdate,
             t.close,
             nvl(lag(t.close) over(order by t.stockdate), t.close) zt,
             nvl(lag(t.stockdate) over(order by t.stockdate), t.stockdate) zr,
             t.close - nvl(lag(t.close) over(order by t.stockdate), t.close) blance,
             sign(t.close -
                  nvl(lag(t.close) over(order by t.stockdate), t.close)) blan_sign
        from TEST111 t)
    select x.code, x.stockdate, x.close, x.zt, x.zr, x.blance, x.blan_sign
      from xh x
    

    结果:
    sql1 查询结果
    当blan_sign字段值为1时,表示当天上涨。

    3.4 sql2:根据sql1的结果计算连续上涨的时间段

    SELECT code, MIN(stockdate), MAX(stockdate)
      FROM (
           --dataset1
           with xh as (select t.code,
                              t.stockdate,
                              t.close,
                              sign(t.close -
                                   nvl(lag(t.close) over(order by t.stockdate),
                                       t.close)) blan_sign
                       
                         from TEST111 t)
             select x.code, x.stockdate, x.close, x.blan_sign
               from xh x
              where x.blan_sign = 1
             --end dataset1
              ) t
             
              START WITH NOT EXISTS (SELECT 1
                            FROM (
                                 --dataset1
                                 with xh as (select t.code,
                                                    t.stockdate,
                                                    t.close,
                                                    
                                                    sign(t.close -
                                                         nvl(lag(t.close)
                                                             over(order by
                                                                  t.stockdate),
                                                             t.close)) blan_sign
                                               from TEST111 t)
                                   select x.code,
                                          x.stockdate,
                                          x.close,
                                          x.blan_sign
                                     from xh x
                                    where x.blan_sign = 1
                                   --end dataset1
                                    ) b
                                    WHERE b.stockdate = t.stockdate - 1
                          )
             CONNECT BY PRIOR t.stockdate = t.stockdate - 1
              GROUP BY rownum - LEVEL, code;
    
    

    sql2的查询结果
    接下去请自便,O(∩_∩)O哈哈~

    展开全文
  • 当月签到连续天数

    2017-07-19 15:14:20
    * 当月签到连续天数 * @param signDataList 当月签到日期数据(日期按从前到后排序) * @return */ public static int consecutiveDays(List signDataList){ int cint = 0; if(null == signDataLis
  • 直接来看实战,现在有一张表t,这张表存储了每个员工每天的打卡情况,现在需要统计截止目前每个员工的连续打卡天数,表t如下表所示: uid tdate is_flag 1 2020/2/1 1 1 2020/2/2 0 1 2020/2/3 1 1 2020/2/4 1 1 ...
  • i++){ dayList.push({day:dayNum+i,check:false,num:(dayNum+i)*10 + 10}) } return dayList } } } 参数说明 dayNum:连续天数 dayList:连续天数对应数组数据 day:对应当前连续天数前后几天 check:对应当前连续...
  • 需求:得到指定时间开始往前数连续的天数,如id为a的数据对应时间:20200115,20200114,20200112,20200101,给定查询时间为20200115,则连续天数为2,一中断就终止 初始数据: 答案: -- 部分数据 WITH T_...
  • 连续N天登录的数据获取(hive)

    千次阅读 2018-11-13 16:56:21
    1、获取用户连续登录天数 --整合源表,保证一个用户每天一条记录 drop table if exists xxnisj1112_uid_basic; create table xxnisj1112_uid_basic as select uid,pt_day from oss_bi_all_user_login_log where pt...
  • HIVE-SQL求连续天数

    千次阅读 2019-11-28 19:42:50
    需求:求用户连续登陆天数 1.数据准备 create table tmpdb.test_01 as select '1001' as user_id, '2017-01-01' as login_date union all select '1001' as user_id, '2017-01-02' as login_date union all select '...
  • function ...//如果只要找出所有连续天数,不需要中断 } console.log(num); } } else { console.log( '第一天' ); } } lianxuDay(); 感谢分享 https://www.jb51.net/article/114669.htm
  • 最近连续登录天数(求用户最后一次获取活跃的连续登录天数) 方法一 with active as ( select distinct --防止用户每日活跃数据重复(即用户在某一天登陆两次) name ,active_date ,rank -- 如果连续,那么这个date_...
  • hive连续天数统计思路

    2019-08-02 19:58:00
    测试数据: T1 Uid dt login_status(1登录成功,0异常) 1 2019-07-11 1 1 2019-07-12 1 1 2019-07-13 1 1 2019-07-14 1 1 2019-07-15 1 1 2019-07-16 1 1 2019-07-17 1 1 2019-07-18 1 2 2019-07-11 1 2 ...
  • [color=#FF0000]我的需求是,需要在今天登录之后,可以看到我已经连续登录了几天。[/color] 头疼了一下午,百度了好久,着实没有思路,也没有找到适合我的 SQL。 只能麻烦各位了,非常感谢。。 下面是为各位...
  • select min(rq) as start2 -- 起始日期 ...,max(id1)-min(id1)+1 as dayy -- 连续天数 ,dif -- 分组 from ( select (t1.id1+t2.id2) as dif ,t1.rq ,t1.id1 ,t2.id2 from ( ...
  • MySQL中实现连续日期内数据统计,缺省天数0补全昨天群里有同学在问:想要查找当前日期到前7天时间内,每天的数据量总和是多少?这个相信很多人都可以想到直接用group by data就可以实现,但是这里有一个关键,现在...
  • SQL-求某用户连续购买以及与上次购买间隔Step 1:对数据进行聚合/去重Step 2:对用户进行分组排序Step 3:日期与序号进行减法运算Step 4:获取开始连续的日期以及连续天数Step 5:使用Hive中lead函数 Step 1:对数据进行...
  • 步骤2:在步骤1的基础上用dt减去排序序号的天数得到一个时间(sub_dt),因为我们已经按照顺序排序了所以只要得到的时间相同,则表示这两个时间是连续的。接下来只需要对uid和sub_dt进行分组,求coun.
  • Hive最大连续登陆天数

    千次阅读 2019-12-11 16:40:28
    分类详情参数设置业务场景实现用户最大连续登陆天数问题汇总 参数设置 业务场景实现 用户最大连续登陆天数 问题是用户登陆埋点,会记录用户的id和记录的日期,原始数据如下: id ds A 2019-01-01 B 2019-...
  • 关于连续天数的几个思路。

    千次阅读 2016-08-23 22:53:32
    上个月做了个需求,要求统计一张表中某ID连续出现5天(时间连续5天,也不让新建表之类的,就是要求纯sql来做)的具体信息。一开始就是一脸懵逼,没思路然后是百度,找到了第一种解法: 1.采用左连接,把单表每次都...
  • Sql如何统计连续打卡天数

    千次阅读 2020-04-11 10:17:45
    总第208篇/张俊红今天来解一道题面试中可能经常会被一些面试官拿来“刁难”的题,就是《如何统计连续打卡天数》,当然了这里面的打卡可以换成任意其他行为,比如连续登陆天数连续学习天数,连...
  • SQL获取连续时间

    千次阅读 2018-11-14 12:11:15
    但是这些信息或许不是连续的,或许每一天有多条,有的时候某一天甚至没有数据,那么这时候我们需要一个连续的时间,然后计算每一天的收入额或者其他的信息记录。 我们一开始的设想差不多就是通过计算机能识别的方法...
  • @mysql查询最大连续天数 sql

    千次阅读 2019-11-20 17:15:16
    当两个时间差值为1的时候,则为连续天数, @countday + 1 变量加一,否则为1 结束 @last_date := date 将data赋值变量@last_date 所以每次比较的都是当前行data和上一行data比较。 (select @countday:=0,@...
  • 接上一篇文章的签到那个统计有一个算出连续签到就要去日志表获取一段时间内的数据, 例如如下json数组 [ {"oneday_time":1588435200,"oneday":"2020-05-03","week":"0","weektext":"周日","morning":1588455858...
  • 获取当前签到的最后时间(今天或昨天),定义一个变量@i 对签到时间进行天数自减, 然后查询出当前记录签到时间是否与自减后的时间匹配. 如果匹配表示天数连续时间. SELECT count(1)FROM ( SELECT date_sub(a....
  • 最近在处理数据的时候遇到一个需求,核心就是求取最大连续行为天数。 这里用北京空气质量数据作为案例进行演示,需求是找出北京空气质量连续污染最长持续多久并确定其周期。 图1:案例数据 以上图中数据来算,...
  • 1、给出以下数据,计算用户连续登录的天数数据格式为:用户,登录日期 user001,2020-03-14 user002,2020-03-13 user001,2020-03-19 user001,2020-03-18 user002,2020-03-12 user001,2020-03-20 user002,2020-03-...
  • 数据运营人员常常会需要查找活跃用户名单,而活跃用户很多情况下被定义为连续在线或发单n天及以上的用户。一方面我们可以根据n的值直接进行筛选;更具一般性地,就要求我们去求取每个用户某段时间内的最大连续在线...
  • 查询当前时间前的连续日期 SELECT @num := @num + 1, DATE_FORMAT( ADDDATE( ...由于生成的天数取决于follow表的数据条数,所以请确保follow 表中有足够的数据,比你生成的日期数据条数还多。
  • 今天来解一道题面试中可能经常会被一些面试官拿来“刁难”的题,就是《如何统计连续打卡天数》,当然了这里面的打卡可以换成任意其他行为,比如连续登陆天数连续学习天数连续购买天数,这里的天...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,033
精华内容 2,413
关键字:

获取连续天数的数据