在oracle中领导功能组

时间:2017-01-16 05:20:46

标签: oracle11g

我想通过两列引导功能进行分组。这是我的表数据。

 Id  Name_Id  Name   Item_Id    Item_Name         date
 1      1      Car       1          SUV        1-Jan-2015
 2      1      Car       1          SUV        12-March-2015
 3      1      Car       1          SUV        20-April-2015
 4      1      Car       2          Sport      23-April-2015
 5      2      Bike      1          SUV        18-July-2015
 6      2      Bike      1          SUV        20-Aug-2015
 7      2      Bike      2          Sport      18-Sept-2015
 8      2      Bike      3          Honda      20-OCT-2015

我需要上表中的结果,如。

 Id  Name_Id  Name   Item_Id    Item_Name       start date     end date
 1      1      Car       1          SUV        1-Jan-2015      20-April-2015
 2      1      Car       2          Sport      20-April-2015   23-April-2015
 3      2      Bike      1          SUV        18-July-2015    20-Aug-2015
 4      2      Bike      2          Sport      20-Aug-2015     18-Sept-2015
 5      2      Bike      3          Honda      18-Sept-2015    20-OCT-2015

任何建议都非常感谢。

1 个答案:

答案 0 :(得分:1)

我认为你不需要在这里使用LEAD。下面的CTE为每个Item_Id计算最早和最晚的日期。然后将其加入原始表格,以限制与最早 Item_Id对应的记录。与此同时,结束日期也会在加入期间被拉入。

WITH cte AS (
    SELECT Name,
           Item_Id,
           MIN(date) AS start_date,
           MAX(date) AS end_date
    FROM yourTable
    GROUP BY Name, Item_Id
)
SELECT t1.Id, t1.Name_Id, t1.Name, t1.Item_Id, t1.Item_Name,
       t2.start_date,
       t2.end_date
FROM yourTable t1
INNER JOIN cte t2
    ON t1.Item_Id = t2.Item_Id AND
       t1.Name    = t2.Name AND
       t1.date    = t2.start_date