每个人......目前我有一张桌子如下..
DATE BATCHNO PRODCODE
----------------------------------------------
31/12/2009 23.53 10859 2003P
01/01/2010 00.04 10860 2003P
01/01/2010 00.06 10861 2003P
01/01/2010 00.13 10862 2003P
01/01/2010 00.30 10863 1259
01/01/2010 03.02 10864 639B
01/01/2010 03.13 10865 639B
01/01/2010 03.20 10866 639B
01/01/2010 04.13 10867 2003P
01/01/2010 04.20 10868 2003P
01/01/2010 04.30 10863 2003P
以上是我现在拥有的表的示例..每当有新的BATCHNO并且BATCHNO增加1时就会生成DATE .. PRODCODE是机器制造产品的产品代码,让我们说产品2003P完成制造后,它将自动转到另一种产品,如1259 ......
我想将这些数据计算到下面所需的结果中:
DATE PRODCODE
----------------------------------------------
31/12/2009 23.53 2003P
01/01/2010 00.13 2003P
01/01/2010 00.30 1259
01/01/2010 00.30 1259
01/01/2010 03.02 639B
01/01/2010 03.20 639B
01/01/2010 04.13 2003P
01/01/2010 04.30 2003P
意味着31/12/2009 23.53是产品2003P和01/01/2012的开始时间00.13是产品2003P的停止时间..产品1259是特殊的,因为01/01/2010 00.30只生产移动到其他产品之前的1个产品..基本上我不能使用group by因为它将由所有相同代码的产品分组..问题是检测特定产品代码的开始时间和停止时间。 。怎么能实现呢?这是针对SQL SERVER 2005 ...
谢谢大家..
答案 0 :(得分:3)
select U.[DATE], U.PRODCODE
from
(
select min(T.[DATE]) as StartDate,
max(T.[DATE]) as EndDate,
T.PRODCODE
from
(
select [DATE],
PRODCODE,
row_number() over(order by [DATE]) as rn1,
row_number() over(order by PRODCODE, [DATE]) as rn2
from YourTable
) T
group by T.PRODCODE, T.rn2-T.rn1
) T
unpivot
(
[DATE] for D in (StartDate, EndDate)
) U
order by U.[DATE]
答案 1 :(得分:2)
创意:添加一列以获取下一个DIFFERENT作品开始时间的ID,然后删除并查询以填充它。然后创建另一列,但这次保存以前的DIFFERENT段结束时间。此类任务的代码将是子查询
update table set
prev=(select top 1 batchno from table x where x.prodcode!=table.prodcode and x.date<table.date order by x.date DESC)+1,
next=(select top 1 batchno from table x where x.prodcode!=table.prodcode and x.date>table.date order by x.date ASC)-1
这样你就可以拥有每种产品的界限。从现在开始你只是
select prodcode, prev, next from table group by prodcode, prev, next
最后在prev=prodcode
和next=prodcode
上的最后一个查询的表格中加入日期。