4

大家...目前我有一张如下表..

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 个产品移至其他产品..基本上我不能使用分组,因为它将按所有相同代码的产品分组..问题是检测特定产品代码的开始时间和停止时间。. 如何做到这一点?这是针对 SQL SERVER 2005 ...

谢谢大家 ..

4

2 回答 2

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]

SE-数据

于 2012-05-21T05:32:55.510 回答
2

思路:加一列获取下一个DIFFERENT片开始时间的id,去掉查询填充。然后创建另一列,但这次保存之前的不同片结束时间。此类任务的代码将是子查询

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最后在and上的最后一个查询中加入表中的日期next=prodcode

祝你好运 :)

于 2012-05-21T03:06:19.613 回答