SQL返回两行之间的秒差

2024-06-19

这个问题与SQL Server有关。我有下表:

id    size   batch code   product code      additiontime
--------------------------------------------------------
1       91      55555       BigD Red        2017-05-15 13:00:00
2       91      55555       BigD Red        2017-05-15 13:00:05
3       94      55555       BigD Red        2017-05-15 13:00:15
4       91      44444       BigD Blue       2017-05-15 14:10:00
5       92      44444       BigD Blue       2017-05-15 14:15:00
6       93      44444       BigD Blue       2017-05-15 14:20:00
7       94      44444       BigD Blue       2017-05-15 14:30:00
8       91      33333       BigD Orange     2017-05-15 15:00:00
9       91      33333       BigD Orange     2017-05-15 15:00:10
10      94      33333       BigD Orange     2017-05-15 15:00:15

当我执行这个SQL语句时:

select *
from mytable y1
where size = 91 
  and not exists (select 1
                  from mytable y2
                  where y1.productcode = y2.productcode and y2.size = 92)

我得到以下结果:

id    size   batch code   product code      additiontime
--------------------------------------------------------
1       91      55555       BigD Red        2017-05-15 13:00:00
2       91      55555       BigD Red        2017-05-15 13:00:05
8       91      33333       BigD Orange     2017-05-15 15:00:00
9       91      33333       BigD Orange     2017-05-15 15:00:10

我想修改上面的查询,以便每个批处理代码显示一行,并添加一个附加列以显示每个批处理代码组的第一条记录和第二条记录之间的秒数差异,例如:

id    size   batch code   product code      additiontime            seconds difference
--------------------------------------------------------------------------------------
1       91      55555       BigD Red        2017-05-15 13:00:00     5
8       91      33333       BigD Orange     2017-05-15 15:00:00     10

我尝试过以下 SQL,它几乎可以解决问题,但它返回多行,而不是每批代码只返回一行:

WITH rows AS
(
    SELECT 
        *, 
        ROW_NUMBER() OVER (ORDER BY AdditionTime) AS rn 
    FROM 
        mytable y1
    WHERE
        size = 91 
        AND NOT EXISTS (SELECT *
                        FROM mytable y2
                        WHERE y1.productcode = y2.productcode AND y2.size = 92)
)
SELECT DATEDIFF(second, mc.AdditionTime, mp.AdditionTime)
FROM rows mc
JOIN rows mp ON mc.rn = mp.rn - 1

我的 SQL 知识不是很多。我确信有可能产生正确的结果,但我已经尝试了所有方法但没有成功。预先感谢您的任何指点。


这将为您提供所需的输出,并对 cte 结果进行自连接。另外,我添加了一个PARTITION BY to the ROW_NUMBER():

CREATE TABLE #mytable
    (
      id INT ,
      size INT ,
      batchCode INT ,
      productCode NVARCHAR(30) ,
      additiontime DATETIME
    );


INSERT  INTO #mytable
        ( id, size, batchCode, productCode, additiontime )
VALUES  ( 1, 91, 55555, 'BigD Red', '2017-05-15 13:00:00' ),
        ( 2, 91, 55555, 'BigD Red', '2017-05-15 13:00:05' ),
        ( 3, 94, 55555, 'BigD Red', '2017-05-15 13:00:15' ),
        ( 4, 91, 44444, 'BigD Blue', '2017-05-15 14:10:00' ),
        ( 5, 92, 44444, 'BigD Blue', '2017-05-15 14:15:00' ),
        ( 6, 93, 44444, 'BigD Blue', '2017-05-15 14:20:00' ),
        ( 7, 94, 44444, 'BigD Blue', '2017-05-15 14:30:00' ),
        ( 8, 91, 33333, 'BigD Orange', '2017-05-15 15:00:00' ),
        ( 9, 91, 33333, 'BigD Orange', '2017-05-15 15:00:10' ),
        ( 10, 94, 33333, 'BigD Orange', '2017-05-15 15:00:15' );
WITH    rows
          AS ( SELECT   * ,
                        ROW_NUMBER() OVER ( PARTITION BY y1.batchCode ORDER BY additiontime ) AS rn
               FROM     #mytable y1
               WHERE    size = 91
                        AND NOT EXISTS ( SELECT *
                                         FROM   #mytable y2
                                         WHERE  y1.productCode = y2.productCode
                                                AND y2.size = 92 )
             )
    SELECT  t1.id ,
            t1.size ,
            t1.batchCode ,
            t1.productCode ,
            DATEDIFF(SECOND, t1.additiontime, t2.additiontime) SecondsDiff
    FROM    rows t1
            INNER JOIN rows t2 ON t2.batchCode = t1.batchCode
                                  AND t1.id != t2.id
    WHERE   t1.rn = 1; 

DROP TABLE #mytable

生产:

id  size    batchCode   productCode  SecondsDiff
8   91      33333       BigD Orange  10
1   91      55555       BigD Red     5

请注意,您应该使用更大的数据集进行测试,以确保准确性并考虑任何其他场景。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL返回两行之间的秒差 的相关文章

  • 针对表中的每一行运行 SQL Server 函数

    我有一个函数可以迭代表中的 每一行 当它运行时 它应该查看每一行 提取该行的相关 SET 值并运行该函数 该函数依次返回结果并使用正确的值更新正确的行 发生的情况是 它正在运行并返回最后一行的值 并用该值更新所有行 有什么想法我做错了吗 S
  • 在sql server中使用isnumeric捕获异常

    我在一列中有这个可能的值 1 65 5 excellent 54 1 如果我在最后一个示例中使用 isnumeric 我会得到 1 但是当我尝试转换为数字时 我收到错误 我想在函数中使用 try catch 但不能 我该如何处理 顺便说一句
  • 从 SQL Server 表中获取随机行数

    我正在尝试使用快速方法从一个大表 超过 100 万行 中获取 5 个随机行数 到目前为止 我已经使用这些 SQL 查询进行了测试 Method 1 Select top 5 customer id customer name from Cu
  • 实体框架无法删除数据库,数据库正在使用中

    我 和许多其他人一样 遇到了这样的问题 我无法让我的 NUnit 测试删除数据库中的数据库 SetUp 我的测试装置 我想要实现什么 我想编写集成测试来测试我的代码并验证预期结果是否存储在数据库中 断言 CRUD 方法 那 and我希望能够
  • 尝试删除时 SQL 异常错误 #547 和外键约束违规

    我正在查看一些代码 我没有编写它 来测试我们的代码在尝试删除存在依赖项的表行时是否捕获两个错误条件 该代码最初查找消息中的特定文本 而不是使用错误号 为了提供多语言支持 最好根据错误号而不是错误消息来捕获异常 在测试中 代码正在查找两组文本
  • 在 SQL Server 中使用透视(错误)- 列名无效

    SELECT Reg number Surname SESREFDATETIME1 ATTENDANCE1 SESREFDATETIME2 ATTENDANCE2 SESREFDATETIME3 ATTENDANCE3 SESREFDATE
  • 列出 pandas.read_sql 中的 sql 表

    我想打开一个 SQL 2005 数据库 文件扩展名为 mdf 我一直在尝试这样做 import pandas as pd import pyodbc server server name db database name conn pyod
  • 重置 JDBC Kafka 连接器以从头开始提取行?

    Kafka 连接器可以利用主键和时间戳来确定需要处理哪些行 我正在寻找一种重置连接器的方法 以便它从一开始就进行处理 因为要求是在分布式模式下运行 所以最简单的做法是将连接器名称更新为新值 这将提示在 connect offsets 主题中
  • 使用左连接在单个更新语句中更新多个表

    我意识到我所要求的可能是不可能的 我想基于 LEFT JOIN 和 WHERE 子句对两个单独的表执行 UPDATE 这是我的尝试 UPDATE PERIODDATES as pd periods2 as p2 SET pd PERIODC
  • 分解 SQL 表中每一行的 XML

    我有一个表 其中包含两列 ID 和 XML 数据 我想分解每个 ID 的 XML 我在 XML 中提取单个值 并且所有 XML 的结构都相同 我只是不确定如何循环遍历表并将 XML 查询应用于每一行 我需要应用的查询如下 Select to
  • SQL 英文查询发生了什么?

    SQL Server 2000 与 English Query 一起部署 当时我还年轻 对 SQL 还很陌生 所以我跳过了那一章 多年后的现在 又出现了制作一个可以理解简单用户问题的逻辑程序的想法 还有其他选择吗 英语查询现在在哪里 英文查
  • SQL Server 2005 中的分层查询

    早在我在 Oracle 商店工作时 我就认为 CONNECT BY 是理所当然的 现在我一直在使用 SQL Server 2005 并且有一些令人讨厌的对象层次结构 具体来说 我们有一个自引用表 其中所有子记录都有一个包含其父记录 ID 的
  • SQL Server:如何从递归函数内执行更新?

    我有一个递归标量函数 需要根据它返回的值更新另一个表中的记录 但是函数中不允许使用 UPDATE 语句 如何从函数内更新表 不允许使用 UPDATE 语句 功能 这就是规则 函数不允许有任何数据更改的副作用 您必须使用存储过程来UPDATE
  • 如果运行战争,oracle 和 sybase 数据库连接会出现 ClassNotFoundError,但在 eclipse 中工作正常

    我在应用程序中构建了一个功能来测试数据库连接 在本地 我能够测试所有三个数据库 sqlserver sybase 和 oracle 但如果创建 war 文件并在 Windows Linux 服务器中运行 war 则 Oracle 和 syb
  • SQL Server 2016升级到13.0.15700.28版本后频繁出现System.OutOfMemoryException

    我在具有多个显示器 16 GB DDR4 RAM 4 Ghz I7 GTX 970 的开发盒上运行 Windows 10 Pro 64 位 我使用 SQL Server 2016 Developer Edition 和 VS 2015 En
  • 使用 HTTP 访问数据库对象

    是否可以使用 HTTP 访问数据库对象SQL Server 2012它的完成方式是使用SQL Server 2000 我提到了下面的文章 但它是关于SQL Server 2000 使用 HTTP 访问数据库对象 http technet m
  • 更新语句错误:子查询返回超过 1 个值

    我正在尝试更新列中的所有记录 以便它们以 CD 开头 例如DCE206 将成为 CDE206 UPDATE table SET column REPLACE column1 DC CD WHERE column1 LIKE DC 我正在使用
  • 对不同记录进行 PIVOT 查询

    我有下表 Id Code percentage name name1 activity 1 Prashant 43 43 James James Running 1 Prashant 70 43 Sam Sam Cooking 1 Pras
  • 将记录与另一个表上的最新记录连接

    我正在尝试创建一个 SQL 视图 我如何从一个表中选择最新的记录 而其他记录保持原样 我需要从所有表中选择所有记录 这工作正常 但我需要仅按日期选择最新的提案 这是我遇到的问题 这是我到目前为止所拥有的 SELECT TOP 100 PER
  • 如何使用存储过程 SQL SERVER 2008 R2(mssql) 插入 PHP 数组值

    我有这个数组 REV Array 0 gt 240 1 gt 241 2 gt 242 3 gt 243 4 gt 249 我现在使用下面的代码进行插入 将每个数组的元素存储在带有 id userID Type 和 Date 的行中 if

随机推荐