1

我们有一个表格,其中包含产品订阅的状态更新。订阅开始时会向表中插入一条记录,订阅结束时会使用结束日期更新该记录。我们的一个系统(不知道是哪一个)有时会在结束订阅然后再次开始(创建新记录)时执行“同一天删除\添加”。因此,相同的订阅者 ID 附加到多个记录,即使没有真正改变。

示例数据如下:

recID subID   start           end        prodtype
1     19    01/11/2001  01/15/2001    A
2     19    01/15/2001  01/16/2001    A
3     19    01/16/2001  01/20/2001    A
4     19    01/30/2001  01/31/2001    A

这家伙从 1/11 开始,到 1/20 结束。记录 2 和 3 由系统输入(同一天删除添加,但不是真的)。记录 4 是 19 先生后来开始的另一个订阅。

我有一些代码将尝试仅解析每个不同订阅的第一条(实际)记录,但如果不使用 max() 并按订阅者分组,它就无法找到真正的结束日期。这当然会显示两个订阅,1/11 - 1/31 和 1/30 - 1/31,这是错误的。

我正在努力将这种模式解决为两个这样的记录:

subID   start           end        prodtype
 19    01/11/2001   01/20/2001    A
 19    01/30/2001   01/31/2001    A

这是在 Teradata 中,但我相信它只是 ANSI SQL。

4

2 回答 2

0

您可以使用如下代码找到所有具有实际结束日期的记录:

select t1.*
from myTable t1 left outer join myTable t2 on
t1.SubID = t2.SubID and  
t1.end = t2.start and t2.start is null

当然,您可以通过类似的方式找到开始记录。然后也许你可以把它们拼凑在一起。

也就是说,有时会放弃对 select 语句的所有处理,并使用存储过程,或者将所有数据带回客户端并在那里处理。

于 2012-02-10T20:34:37.970 回答
0

我相信这是 ANSI SQL,但我只在 SQL Server 上测试过。

基本上,查询能够相互独立地找到真正的开始日期和真正的结束日期。然后将开始日期和结束日期关联起来,将开始日期与大于开始日期的结束日期相关联......然后显示最小的结束日期。

SELECT
    startDates.subId,
    startDates.startDate,
    MIN(endDates.endDate) AS endDate,
    startDates.prodType
FROM
(
    SELECT
        recID, subID, startDate, prodType
    FROM yourTable s1
    WHERE NOT EXISTS (
        SELECT 1
        FROM yourTable s2
        WHERE 
            s1.startDate = s2.endDate
            AND s1.subId = s2.subId
    )
) startDates JOIN
(
    SELECT
        recID, subID, endDate, prodType
    FROM yourTable s1
    WHERE NOT EXISTS (
        SELECT 1
        FROM yourTable s2
        WHERE 
            s1.endDate = s2.startDate
            AND s1.subId = s2.subId
    )
) endDates ON
    startDates.subID = endDates.subID 
    AND startDates.startDate < endDates.endDate
GROUP BY
    startDates.subId,
    startDates.startDate,
    startDates.prodType

这是正在执行的查询...

于 2012-02-10T20:58:10.187 回答