2013-11-25 23 views
1

在下面的数据中,对于每个事件,我需要选择Date字段等于或大于指定日期的第一行,并且我需要选择日期所在的行是指定日期之后未来最大的日期。但是,我不希望返回两个单独的行,而是每个事件只有一行,其中第一条记录的日期可以标记为StartDate,第二条记录的日期标记为EndDate。下面是数据:将两行中的字段组合成一行

表EventDates

ID  EventID  Date 
1  10  2013-12-01 
2  10  2013-12-02 
3  10  2013-12-03 
4  10  2013-12-04 
5  11  2013-12-03 
6  11  2013-12-04 
7  11  2013-12-31 

所以,如果我要选择或2013年12月2日之后发生的事件,选择的数据将是:

ID  EventID  Date 
2  10  2013-12-02 
4  10  2013-12-04 
5  11  2013-12-03 
7  11  2013-12-31 

但我真正想要的是:

ID  EventID  StartDate EndDate 
2  10  2013-12-02 2013-12-04 
5  11  2013-12-03 2013-12-31 

请注意,ID是指具有最低日期的行。

回答

2

您是否尝试过使用Aggregate functions

SELECT  MIN(ID) AS ID    -- Smallest ID 
      , EventID     -- EventID 
      , MIN(Date) AS StartDate -- Earliest Date 
      , MAX(Date) AS EndDate  -- Latest Date 
FROM  table 
WHERE  Date >= '2013-12-02' 
GROUP BY EventID      -- From all records that share an EventID 

UPDATE

您应该能够使用子查询,如果你想要回uniqueidentifier ID:

SELECT  table.ID 
      , aggregates.EventID 
      , aggregates.StartDate 
      , aggregates.EndDate 
FROM  (
       SELECT  EventID      -- EventID 
          , MIN(Date) AS StartDate -- Earliest Date 
          , MAX(Date) AS EndDate  -- Latest Date 
       FROM  table 
       WHERE  Date >= '2013-12-02' 
       GROUP BY EventID      -- From all records that share an EventID 
      ) AS aggregates 
      INNER JOIN table 
       ON table.EventID = aggregates.EventID 
       AND table.Date = aggregates.StartDate 
WHERE  Date >= '2013-12-02' 
+0

其实我简化我的表中的数据之上。 ID字段实际上是唯一标识符。你的代码不能用于这个。我修改了你的答案,使其与uniqueidentifiers工作,但我不得不放弃返回ID字段。 – AndroidDev

+0

@AndroidDev:更新答案以允许使用'uniqueidentifier' ID。 – pete