很难用言语解释我想要完成的事情,所以这里有一个例子。我们假设我们有下表:
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日开始显示它。
有没有人知道这是否可行以及我将如何进行呢?
答案 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
)
您可以尝试使用此解决方案并告诉我是否正常工作