sql server—如何在sql中遍历表的子集

zdwk9cvp  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(405)

我是sql新手,如果有任何建议我都会很感激!
我有一个存储订单历史记录的表。它包括以下列: ORDERID , ORDERMILESTONE , NOTES , TIMESTAMP .
有一个 TIMESTAMPORDERMILESTONE 在一个 ORDERID 反之亦然。
我想做的是比较 TIMESTAMP 这是肯定的 ORDERMILESTONE 以获取从开始到完成或从订单到装运等所需的时间。
为了得到这个,我必须收集一个特定的 ORDERID ,然后以某种方式遍历它们。。。当我试图通过宣布 TVP 对于每个 ORDERID ,但这需要更多的时间,因为我的一些数据集有20000行长。
你推荐什么?提前谢谢。
编辑:
在我的问题中,我想找出订单在qa中花费的天数。例如,一旦下了订单,我们就需要发出请求的项目,然后将其发送给qa。所以有一个里程碑“处理”和一个里程碑“qa”。该项目可以在“处理”然后“质量保证”一次,并得到出货,或它可以被送回质量保证几次,或来回之间的“处理”和“工程”。我想找出项目在qa中花费的总时间。
以下是一些示例数据:
医嘱ID |医嘱里程碑|备注|时间戳
43 |放置|新订购的定制时光机| 07-11-2020 12:00:00
43 |加工|首次装配| 07-11-2020 13:00:05
43 | qa |发送至qa | 07-11-2020 13:30:12
43 |工程部|工程部正在修理时光机上的曲柄,它能跳过偶数年| 07-12-2020 13:00:02
43 | qa |发送给qa测试新曲柄。时间机器不应该再跳过几年07-13-2020 16:00:18
0332at |放置|定制彩虹色光剑| 07-06-2020 01:00:09
0332at |加工|光剑在建| 07-06-2020 06:00:09
0332at | qa |光剑测试| 07-06-2020 06:00:09
我要的是每个订单在qa上花费的总天数。
所以我想我可以创建一个包含每个qa里程碑和下一个里程碑的查找表。然后总结每个qa里程碑和随后的qa里程碑之间的差异。我的主要问题是,我不一定知道有多少次的项目将需要发送给qa对每个订单。。。

koaltpgm

koaltpgm1#

为了得到时间来完成一个特定的里程碑的所有命令,你可以做

select orderid, 
       DATEDIFF(hh, min(TIMESTAMP), max(TIMESTAMP))
from your_table
where ORDERMILESTONE = 'mile stone name'
group by orderid
8e2ybdfx

8e2ybdfx2#

假设您使用的是sql server,并且里程碑没有重复,那么您可以使用:

select om.orderid, 
       datediff(seconds, min(timestamp), max(timestamp))
from order_milestones om
where milestone in ('milestone1', 'milestone2')
group by om.orderid;

如果您想在每一行上更普遍地执行此操作,可以使用累积聚合函数:

select om.*, 
       datediff(seconds,
                timestamp, 
                min(case when milestone = 'order' then timestamp end) over 
                    (partition by orderid
                     order by timestamp
                     rows between current row and unbounded following
                    )
               ) as time_to_order
from order_milestones om
group by om.orderid;
7jmck4yq

7jmck4yq3#

您可以创建一个查找表,其中包含一个里程碑并给出上一个里程碑。然后,可以左键联接到它,左键联接回原始表,以获取上一个里程碑处相同顺序的行,并比较日期(sqlfiddle):

select om.*, datediff(minute, pm.TIMESTAMP, om.TIMESTAMP) as [Minutes]
from OrderMilestones om
left join MilestoneSequence ms on ms.ORDERMILESTONE = om.ORDERMILESTONE
left join OrderMilestones pm on pm.ORDERID = om.ORDERID
      and pm.ORDERMILESTONE = ms.PREVIOUSMILESTONE
order by om.TIMESTAMP

相关问题