【发布时间】:2021-08-06 10:41:15
【问题描述】:
我正在查询一个请求数据集,并希望在服务请求之间获得“正常运行时间”。这篇文章Discrete Derivative in SQL 几乎就是我所追求的。但是,我正在处理日期时间数据,我不相信我可以假设工作订单将按时间顺序排序。另外,我对每个请求都有特定的位置。
| Request | Location | RequestDate | CompleteDate |
|---|---|---|---|
| R-001 | a | 1/1/2020 | 1/5/2020 |
| R-002 | a | 3/17/2020 | 3/20/2020 |
| R-004 | b | 2/27/2020 | 3/1/2020 |
| R-003 | b | 4/22/2020 | 4/23/2020 |
| R-005 | a | 7/3/2020 | 7/7/2020 |
我确实看到了SQL DATEDIFF() 函数。 以下是对引用帖子中顶级答案的轻微修改。
Select a.RequestDate as StartTime
, b.CompleteDate as EndTime
, DATEDIFF(b.RequestDate-a.CompleteDate) as TimeChange
FROM YourTable a
Left outer Join YourTable b ON b.time>a.time
Left outer Join YourTable c ON c.time<b.time AND c.time > a.time
Where c.time is null
Order By a.RequestDate
另外,我有点掌握两次别名同一张表但不完全。我也不明白外部连接。 最终,我想要新的专栏……如果这样可以简化问题,我可以提前做出假设或按请求日期排序。
| Request | Location | RequestDate | CompleteDate | Up-Time |
|---|---|---|---|---|
| R-001 | a | 1/1/2020 | 1/5/2020 | null |
| R-002 | a | 3/17/2020 | 3/20/2020 | 72 |
| R-004 | b | 2/27/2020 | 3/1/2020 | null |
| R-003 | b | 4/22/2020 | 4/23/2020 | 52 |
| R-005 | a | 7/3/2020 | 7/7/2020 | 105 |
我希望它与原始帖子没有太大不同,其中按位置分组并按请求日期排序。
【问题讨论】:
-
您能否假设特定请求的 CompleteDate 早于该位置的下一个(按时间顺序)RequestDate? IE 一个特定位置可以同时有两张有效的票吗?
-
时间戳在哪里?
-
在您找到的帖子中,尝试阅读其他一些建议,尤其是包含
LAG窗口函数的建议。你可能会觉得这很有用。这是一种更直接的方式来使用前一行中的值,就像您似乎需要的那样,而不使用JOIN。 -
另请注意:您将根据数据中的日期/时间或其他标准进行排序。如果您的数据不包含此排序的足够详细信息,您希望如何识别计算正常运行时间差异的行?您还可以使用窗口函数计算运行总和。
标签: sql postgresql