SQL匹配ID字段的多对多日期

时间:2019-06-26 19:21:41

标签: sql sql-server many-to-many

编辑:用户2的固定开始日期

我有一个用户ID列表,每个用户ID都有许多开始日期和结束日期。

开始日期可以在“事件”的“实际”开始日期之后多次记录,结束日期也是如此。

结果应为每个用户“事件”的第一个开始日期和第一个结束日期

我希望这是有道理的,请参见下面的示例。

谢谢!

假定给出了下表:

开始表:

+--------+-------------+
| UserID |  Start      |
+--------+-------------+
|      1 | 2019-01-01  |
|      1 | 2019-01-02  |
|      1 | 2019-01-03  |
|      1 | 2019-04-01  |
|      1 | 2019-04-02  |
|      1 | 2019-04-03  |
|      2 | 2019-06-01  |
|      2 | 2019-06-02  |
|      2 | 2019-10-01  |
|      2 | 2019-10-02  |
+--------+-------------+

结束表:

+--------+------------+
| UserID |  End       |
+--------+------------+
|      1 | 2019-03-01 |
|      1 | 2019-03-02 |
|      1 | 2019-03-03 |
|      1 | 2019-05-01 |
|      1 | 2019-05-02 |
|      1 | 2019-05-03 |
|      2 | 2019-08-01 |
|      2 | 2019-08-02 |
|      2 | 2019-12-01 |
|      2 | 2019-12-02 |
+--------+------------+

结果:

+--------+------------+------------+
| UserID |   Start    |  End       |
+--------+------------+------------+
|      1 | 2019-01-01 | 2019-03-01 |
|      1 | 2019-04-01 | 2019-05-01 |
|      2 | 2019-06-01 | 2019-08-01 |
|      2 | 2019-10-01 | 2019-12-01 |
+--------+------------+------------+

1 个答案:

答案 0 :(得分:0)

不确定我是否同意您的2019-10-02

这是一种解决方法

示例

Select UserID
      ,[Start]  = min([Start])
      ,[End]
From ( 
        Select A.* 
              ,[End] = (Select min([End]) From EndTable Where UserID=A.UserID  and [End] >= A.Start )
        From  StartTable A
     ) A
Group By UserID,[End]

返回

UserID  Start       End
1       2019-01-01  2019-03-01
1       2019-04-01  2019-05-01
2       2019-06-01  2019-08-01
2       2019-10-01  2019-12-01