PC       E      D
工       5       2016-09-01
工       6       2016-09-31
公       5       2016-09-01
公       6       2017-09-31
部分数据如上,加入查询开始日期是2016-09-01,结束日期2016-10-07希望将上面数据变成
PC      E        S                        N
工       5        2016-09-01       2016-09-31
工       6         2016-09-31      2016-10-07
公        5        2016-09-01      2016-10-07

解决方案 »

  1.   

    就是这是一个时间点的数据。 九月1号。九月三十一号 有两条关于pc 为工的数据。 现在我想将她变成 九月一号到九月三十一号。pc为工的数据 e的值为多少。九月三十一号往后pc为工的数据。e的值为多少。   这时候我要将时间变成一个区间段的展示
      

  2.   

    楼主研究一下 lag 和 lead 这两个函数。配合 nvl 函数,正好实现你的需求,有问题再来追问。
      

  3.   

    有一个问题。当pc为不同。会把不同pc的数据组合到一起呢
      

  4.   

    就是当用lead 函数向下找数据的时候。会把中间pc不同的数据拼上去
      

  5.   

    试试这个:SELECT PC,E,CASE WHEN TO_DATE('2016-09-01','YYYY-MM-DD')>=D THEN TO_DATE('2016-09-01','YYYY-MM-DD') END S,NVL(LEAD(D,1)OVER(PARTITION BY PC ORDER BY D),TO_DATE('2016-10-07','YYYY-MM-DD')) AS D FROM TMP
    WHERE D<=TO_DATE('2016-10-07','YYYY-MM-DD')
    ORDER  BY PC,S;
      

  6.   

    简化下:SELECT PC,E,D AS S,NVL(LEAD(D,1)OVER(PARTITION BY PC ORDER BY D),TO_DATE('2016-10-07','YYYY-MM-DD')) AS N FROM TMP WHERE D <=TO_DATE('2016-10-07','YYYY-MM-DD')
     ORDER BY PC,S;其中TMP用你的表名代替~
      

  7.   

    最后重申下,9月没有31号。
    你把它改成9月30号。注意:上述我的语句中,字段D为DATE类型。
      

  8.   

    ok。我看到了那个partition by 已经解决了问题