[英]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.