分区,引导,左连接。不同线数据时间的差异-s

Posted

技术标签:

【中文标题】分区,引导,左连接。不同线数据时间的差异-s【英文标题】:partition, lead, left join. difference between different line data time-s 【发布时间】:2018-02-06 07:05:54 【问题描述】:

我有关于发动机工作时间的数据。数据包括:

object ID - 引擎名称 Stop from - 日期时间格式。引擎停止时创建线路。 Start to - 日期时间格式。

我需要获取有关引擎每天工作多长时间的信息。为了做到这一点,我需要以 ex: first record of stop to (这意味着引擎开始工作) end 推断下一行停止 (引擎停止工作)

为了做到这一点,我得出一个结论,我必须使用分区前导和左连接。

select 
object id, 
engine start (stop to) , 
engine stop (alias after joining), 
time_difference (datediff between engine start "stop to" and engine stop "stop from" alias)

在 i 分区后,每行将有自己的 ID,需要将分区行 ID“引导”(或只是“+1”或“>”)的位置左连接到当前分区行 ID。

这是我设法解决的任务,但我是 sql 新手,我无法完成任务。有什么建议我该怎么做?

【问题讨论】:

你用的是什么版本的mysql。您还可以将示例数据和预期输出作为文本添加到您的问题中。 其实我在 sql server 上。这是 URL:ibb.co/iWLHDx,这是样本数据 OBJECTID STOPFROM STOPTO OBJ_0004944 5/19/2017 6:00 5/26/2017 11:30 OBJ_0004944 5/27/2017 0:00 5/27/2017 17:00 OBJ_000494 2017 年 6 月 1 日 23:59 2017 年 8 月 30 日 10:28 OBJ_0004944 2017 年 9 月 2 日 10:00 2017 年 9 月 7 日 0:00 OBJ_0005018 2017 年 5 月 3 日 12:00 2017 年 5 月 3 日 22:32 OBJ_0005018 2017 年 5 月 4 日 6:30 2017 年 5 月 17 日 19:15 OBJ_0005018 2017 年 5 月 20 日 21:33 2017 年 5 月 21 日 0:37 OBJ_0005018 2017 年 5 月 21 日 18:00 2017 年 5 月 24 日 4: 00 OBJ_0005018 2017 年 5 月 26 日 21:00 2017 年 5 月 27 日 8:00 OBJ_0005018 2017 年 6 月 5 日 13:00 2017 年 7 月 8 日 16:08 您应该更改标签以删除 mysql 并添加 sqlserver。 mysql和sqlserver不一样,sqlserver中很多有用的特性(对于这个问题)在mysql中是不可用的(比如分区)。 感谢您的建议。我已经改变了标签。 【参考方案1】:

这个查询追加对应的stopfrom日期到每一行:

SELECT
    testdata.*,
    LEAD(stopfrom, 1, NULL) OVER (PARTITION BY objectid ORDER BY stopto) AS next_stopfrom
FROM testdata

计算时间差:

WITH cte AS (
    SELECT
        testdata.*,
        LEAD(stopfrom, 1, NULL) OVER (PARTITION BY objectid ORDER BY stopto) AS next_stopfrom
    FROM testdata
)
SELECT cte.*, DATEDIFF(minute, stopto, next_stopfrom)
FROM cte

【讨论】:

经过轻微修改后完美运行。谢谢。

以上是关于分区,引导,左连接。不同线数据时间的差异-s的主要内容,如果未能解决你的问题,请参考以下文章

使用左外连接时 Oracle 分区修剪不起作用

左连接和右连接有啥区别

使用来自两个不同数据库的两个表使用 JOOQ 构建左连接查询

mysql左连接右连接(查询两张表不同的数据)

mysql左连接右连接(查询两张表不同的数据)

SQL中的左连接与右连接,内连接有啥区别