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等?或mayby任何人有另一种方法的想法?谢谢
基于下面的查询输出
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
不知道如果我理解正确的,但这个查询显示了价格被不断增长的数据的所有组:
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
最长期限为10至四个5月13日,连续行。