繁体   English   中英

根据SQL Server中的非唯一列数据选择日期

[英]Selecting a date based upon non unique column data in SQL Server

请提出任何建议........这就是我完全坚持的地方。 我没有代码来显示我尝试过的内容。 因为我想不出一种方法来解决这个问题在sql中? 有人建议我使用数据透视(这个概念的新知识……无法弄清楚)。 Col5的4个步骤构成一个完整的循环。 我已处理了多个步骤,需要一个完整周期的时间安排。 一个循环的一个步骤可能在其他步骤完成之前开始。

表A

Col1    Col2     Col3 Col4 Col4     Col5   Col6
 A       Date1     11     12   13     StepA   AA
 A       Date2     11     12   13     StepB   AA 
 A       Date3     11     12   13     StepC   AA
 A       Date4     11     12   13     StepD   AA
 A       dAte1     11     12   13     StepA   AC
 A       dAte2     11     12   13     StepB   AC 
 A       dAte3     11     12   13     StepC   AC
 A       daTe1     111    12   13     StepA   AB <=== Step is not completed    
 A       dAte4     11     12   13     StepD   AC <=== Step completed but other step started already
 A       daTe2     111    12   13     StepB   AB 
 A       daTe3     111    12   13     StepC   AB
 A       daTe4     111    12   13     StepD   AB

预期输出表(结果):

AA Date1  Date2  Date3  Date4
AC dAte1  dAte2  dAte3  dAte4
AB daTe1  daTe2  daTe3  daTe4 

查询:

SELECT * FROM 
    (SELECT [Col1]
      ,[Col2]
      ,[Col3]
      ,[Col4]
      ,[Col41]
      ,[Col5]
      ,[Col6]
    FROM [dbo].[YourTable])p
PIVOT ( MAX(Col2) FOR Col5  IN ([StepA],[StepB],[StepC],[StepD]) ) PVT

输出:

Col1    Col3    Col4    Col41   Col6    StepA   StepB   StepC   StepD
A       11      12      13      AA      Date1   Date2   Date3   Date4
A       11      12      13      AC      dAte1   dAte2   dAte3   dAte4
A       111     12      13      AB      daTe1   daTe2   daTe3   daTe4

您可以选择所需的列以及在最终选择中要删除的列。(关于col3,Col4,Col41)

** * * 基于注释中解释的逻辑 * ** * ***

/ *提供的样本数据* /

select * from #Testdata

COL1    Date                        COL2   COL3 COL4 COL5  COL6
QMS14   2013-04-08 17:19:52.8944000 3132    95  70   RFP    GSBE 
QMS14   2013-04-08 17:19:58.1445000 3132    95  70   SR     GSBE 
QMS14   2013-04-08 17:19:58.3164000 3132    95  70   RTP    GSBE 
QMS14   2013-04-08 17:19:58.3164000 3132    95  70   SoRe   GSBE
QMS14   2013-04-08 17:39:30.0501000 3132    95  70   RFP    GSBE 
QMS14   2013-04-08 17:39:30.0501000 3132    95  70   SR     GSBE 
QMS14   2013-04-08 17:39:30.3470000 3132    95  70   RTP    GSBE 
QMS14   2013-04-08 17:39:30.3470000 3132    95  70   SoRe   GSBE

/ *假设每个周期在同一分钟发生* /

SELECT 
     COL1 
    ,COL2 
    ,COL3 
    ,COL4 
    ,COL6 
    ,[RFP]
    ,[SR]
    ,[RTP]
    ,[SoRe]
FROM (
    SELECT *
        ,DATEPART(MINUTE,DATE) DateMinute
        ,DENSE_RANK() OVER ( PARTITION BY Col1 ORDER BY DATEPART(MINUTE,DATE)) [Rank]   FROM  #Testdata
        )a
    PIVOT ( MAX([DATE]) FOR COL5 IN ([RFP],[SR], [RTP],[SoRe] )) PVT

OUTPUT:

COL1    COL2    COL3 COL4   COL6    RFP                         SR                          RTP                         SoRe
QMS14   3132     95   70   GSBE     2013-04-08 17:19:52.8944000 2013-04-08 17:19:58.1445000 2013-04-08 17:19:58.3164000 2013-04-08 17:19:58.3164000
QMS14   3132     95   70   GSBE     2013-04-08 17:39:30.0501000 2013-04-08 17:39:30.0501000 2013-04-08 17:39:30.3470000 2013-04-08 17:39:30.3470000

在我看来,循环是由col6具有相同标签的四个“步骤”的组合确定的。 示例中的数据每个代码只有一个周期,但是注释表明可能不止一个周期。

我们如何确定记录属于给定代码的周期? 好吧,一种方法是假设带有该代码的所有循环均已完成,并且仅通过col6, col5枚举记录。 然后,将此附加循环序列号用于聚合。 为了枚举序列,我进一步假设日期随着时间增加。

尽管在这种情况下可以使用数据透视,但我认为聚合方法可能会更清晰一些:

select col6, seqnum,
       MAX(case when col5 = 'StepA' then col2 end),
       MAX(case when col5 = 'StepB' then col2 end),
       MAX(case when col5 = 'StepC' then col2 end),
       MAX(case when col5 = 'StepD' then col2 end)
from (select a.*,
             ROW_NUMBER() over (partition by col6, col5 order by col2) as seqnum
      from a
     ) a
group by col6, seqnum

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM