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

时间:2015-03-17 20:06:45

标签: sql sql-server database tsql

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

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日开始显示它。

有没有人知道这是否可行以及我将如何进行呢?

3 个答案:

答案 0 :(得分:1)

select *  
from 
(
SELECT *,
       LAG(Group, 1,0) OVER (ORDER BY BeginDate) AS PreviousGroup
FROM table 
)
where PreviousGroup is null or PreviousGroup  <> group 

答案 1 :(得分:0)

如果您使用的是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来获取该客户的上一条记录,并删除前一组相同的记录,或删除第一条记录的空白。

如果您使用的是SQL Server 2012或更高版本,则可以使用LAG函数执行此操作,但根据表格的基数,这可能效果不佳:

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

答案 2 :(得分:-1)

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
                  )

您可以尝试使用此解决方案并告诉我是否正常工作