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;
这只是使用 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;
很难用语言来解释我想要完成的事情,所以这里有一个例子。假设我们有以下 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;
这只是使用 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;