Return 值集的第一次迭代即使它们重复,

Return the first iteration of the set of values even if they repeat,

很难用语言来解释我想要完成的事情,所以这里有一个例子。假设我们有以下 table:

Customer    Group   BeginDate   ParentCustomer
1469046     3939    7/1/2010    1311044
1469046     3939    8/1/2010    1311044
1469046     4144    1/1/2011    1460224
1469046     4147    2/1/2011    1461557
1469046     3939    11/1/2013   1311044
1469046     3939    12/1/2013   1311044
1469046     3939    1/1/2014    1311044
1469046     3939    2/1/2014    1311044
1469046     3939    3/1/2014    1311044
1469046     3939    4/1/2014    1311044
1469046     3939    5/1/2014    1311044
1469046     3939    6/1/2014    1311044
1469046     3939    7/1/2014    1311044
1469046     3939    8/1/2014    1311044
1469046     587     9/1/2014    141274
1469046     587     10/1/2014   141274
1469046     587     11/1/2014   141274
1469046     587     12/1/2014   141274

下面是我想要得到的:

Customer    Group   BeginDate   ParentCustomer
1469046     3939    7/1/2010    1311044
1469046     4144    1/1/2011    1460224
1469046     4147    2/1/2011    1461557
1469046     3939    11/1/2013   1311044
1469046     587     9/1/2014     141274

所以,基本上,对于每个组,我只想在它开始时显示。 我有可以满足我需要的代码,但将它抛出的是重复组 3939。它只会在 2010 年 7 月 1 日开始显示一次。

有谁知道这是否可行以及我将如何去做?

select *  
from 
(
SELECT *,
       LAG(Group, 1,0) OVER (ORDER BY BeginDate) AS PreviousGroup
FROM table 
)
where PreviousGroup is null or PreviousGroup  <> group 
SELECT *
FROM table t
WHERE NOT EXISTS (  SELECT 'a'
                    FROM table t2
                    WHERE t2.group = t.group
                    AND DATEADD( DAY, 1, t2.BeginDate) = t.BeginDate
                  )

您可以尝试使用此解决方案并告诉我是否有效

如果您使用的是 SQL Servier 2005 或 SQL Server 2008,那么您可以使用它。

SELECT  T.*
FROM    T
        OUTER APPLY
        (   SELECT  TOP 1 T2.[Group]    
            FROM    T AS T2
            WHERE   T2.Customer = T.Customer
            AND     T2.BeginDate < T.BeginDate
            ORDER BY T2.BeginDate DESC
        ) AS prev
WHERE   prev.[Group] != T.[Group]
OR      prev.[Group] IS NULL;

Example on SQL Fiddle

这只是使用 OUTER APPLY 获取该客户的先前记录,并删除先前组相同的记录,或者删除第一条记录的 null。

如果您使用的是 SQL Server 2012 或更高版本,则可以使用 LAG 函数执行此操作,但这可能不会更好,具体取决于 table 的基数:

SELECT  Customer, [Group], BeginDate, ParentCustomer
FROM    (   SELECT  Customer,
                    [Group],
                    BeginDate,
                    ParentCustomer,
                    PreviousGroup = LAG([Group]) OVER(PARTITION BY Customer ORDER BY BeginDate)
            FROM    T
        ) AS T
WHERE   PreviousGroup != [Group]
OR      PreviousGroup IS NULL;

Example on SQL Fiddle