【问题标题】:Lognest date sequence / group sequence最长日期序列/组序列
【发布时间】:2019-02-07 11:43:46
【问题描述】:
create table test_d as
SELECT price, to_date(startdate,'YYYY-MM-DD') startdate
FROM (
 SELECT 632 as price,'2019-05-01' as startdate FROM DUAL UNION ALL
          SELECT 649,'2019-05-02' FROM DUAL UNION ALL
          SELECT 632,'2019-05-03' FROM DUAL UNION ALL
          SELECT 607,'2019-05-04' FROM DUAL UNION ALL
          SELECT 598,'2019-05-05' FROM DUAL UNION ALL
          SELECT 624,'2019-05-06' FROM DUAL UNION ALL
          SELECT 641,'2019-05-07' FROM DUAL UNION ALL
          SELECT 598,'2019-05-08' FROM DUAL UNION ALL
          SELECT 556,'2019-05-09' FROM DUAL UNION ALL
          SELECT 480,'2019-05-10' FROM DUAL UNION ALL
          SELECT 510,'2019-05-11' FROM DUAL UNION ALL
          SELECT 541,'2019-05-12' FROM DUAL UNION ALL
          SELECT 634,'2019-05-13' FROM DUAL UNION ALL
          SELECT 634,'2019-05-14' FROM DUAL );

有一张桌子。 我想从价格最低的日期开始找到最长的连续日期序列。 所以在这种情况下

1   480 2019-05-10  1   2019-05-09  0
2   510 2019-05-11  2   2019-05-10  0
3   541 2019-05-12  3   2019-05-11  0

我已经做了什么:

SELECT t1.*,
       case
         when startdate = next_d + 1 then 1
         else 0
       end seq 
FROM   (SELECT t.*,
               NVL(LAG(startdate) over(order by rnk asc),startdate-1) next_d
        FROM   (select price,
                       startdate,
                       DENSE_RANK() OVER(ORDER BY price ASC) AS RNK
                from   test_d) t) t1

这给了我:

1   480 2019-05-11  1   2019-05-10  1
2   510 2019-05-10  2   2019-05-11  0
3   541 2019-05-12  3   2019-05-10  0
4   556 2019-05-09  4   2019-05-12  0
5   598 2019-05-05  5   2019-05-09  0
6   598 2019-05-08  6   2019-05-05  0
7   607 2019-05-04  7   2019-05-08  0
8   624 2019-05-06  8   2019-05-04  0
9   632 2019-05-01  9   2019-05-06  0
10  632 2019-05-03  10  2019-05-01  0
11  634 2019-05-13  11  2019-05-03  0
12  634 2019-05-14  12  2019-05-13  1
13  641 2019-05-07  13  2019-05-14  0
14  649 2019-05-02  14  2019-05-07  0

如何在 SEQ 列中对序列进行分组?就像第一行获得数字 1,行 2-11 获得数字 2、12 - 3、13-14 - 0 等等? 或者也许有人对另一种方法有想法? 谢谢

【问题讨论】:

  • 为什么第 2-11 行得到数字 2?他们似乎不符合我的约会顺序

标签: sql oracle lag lead


【解决方案1】:

基于以下查询输出

select t.*, startdate - nvl(LAG(startdate) over(order by price,startdate asc),startdate) date_diff from test_d t

价值较大的 date_diff 列是否是您要达到的目标的答案?即 634 13-MAY-19 10

输出

PRICE   STARTDATE   DATE_DIFF
480 10-MAY-19   0
510 11-MAY-19   1
541 12-MAY-19   1
556 09-MAY-19   -3
598 05-MAY-19   -4
598 08-MAY-19   3
607 04-MAY-19   -4
624 06-MAY-19   2
632 01-MAY-19   -5
632 03-MAY-19   2
634 13-MAY-19   10
634 14-MAY-19   1
641 07-MAY-19   -7
649 02-MAY-19   -5

【讨论】:

    【解决方案2】:

    不确定我是否理解正确,但此查询显示了价格上涨的所有数据组:

    dbfiddle demo

    select min(startdate) mnd, max(startdate) mxd, count(1) cnt, 
           listagg(price, ' -> ') within group (order by startdate) prices
      from (
        select price, startdate, chg, sum(chg) over (order by startdate) grp
          from (
            select price, startdate, 
                   case when lag(price) over (order by startdate) < price then 0 else 1 end chg 
              from test_d t))
      group by grp
    

    所以你的样本输出是:

    MND         MXD                CNT PRICES
    ----------- ----------- ---------- -----------------------------
    2019-05-01  2019-05-02           2 632 -> 649
    2019-05-03  2019-05-03           1 632
    2019-05-04  2019-05-04           1 607
    2019-05-05  2019-05-07           3 598 -> 624 -> 641
    2019-05-08  2019-05-08           1 598
    2019-05-09  2019-05-09           1 556
    2019-05-10  2019-05-13           4 480 -> 510 -> 541 -> 634
    2019-05-14  2019-05-14           1 634
    8 rows selected
    

    最长的时间段在 5 月 10 日至 13 日之间,连续四行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多