SQL 从日期范围中检索第一次运行数据

SQL retrieving 1st run data from a date range

我需要从 Oracle 数据库中检索特定日期范围内的第一次运行信息。首次运行意味着忽略稍后运行的序列号所在的行。

注意:1 = 通过,0 = 失败

我的数据示例是:

SERIALNUM   TIMESTAMP_          PASSED  …{more data}
    001     2015-01-07T11:22:50     0
    002     2015-01-07T11:24:00     0
    003     2015-01-07T11:25:50     1
    001     2015-01-07T11:26:50     1
    004     2015-01-07T11:28:50     1
    005     2015-01-07T11:29:50     1
    006     2015-01-07T11:31:50     1
    002     2015-01-07T11:30:50     0
    002     2015-01-07T11:33:50     1
    007     2015-01-07T11:35:50     1
    008     2015-01-07T11:36:50     1
    0010    2015-01-07T11:39:50     1
    009     2015-01-07T11:37:50     1

期望的结果,测试了 10 个单元,2 个未通过,8 个通过。

Using Excel to get my proper 1st run data I:
[step1] Delete rows outside of my date range.
[step2] Sort by SERIALNUM (1st level) TIMESTAMP_ (2nd level).
[step3] Remove Duplicate SERIALNUM.
[step4] Then count the number of passed units (1 = pass).

这给了我想要的结果。 更改顺序会给我带来不希望的结果。

我可以使用以下方法从我选择的范围内的数据库中获取数据:

SELECT SERIALNUM, TIMESTAMP_, PASSED 
FROM dbTble 
WHERE TO_DATE('01/07/2015 09:00:00', 'MM/DD/YYYY HH24:MI:SS') <= TIMESTAMP_ 
AND TIMESTAMP_ < TO_DATE('01/07/2015 14:59:59', 'MM/DD/YYYY HH24:MI:SS') 
ORDER BY SERIALNUM, TIMESTAMP_

看来我应该使用子查询,但我看到一条注释说子查询无法排序。

如何使用 SQL 命令完成此操作?

这将获取日期范围内 运行 的第一个 运行(仅)。如果特定 serialnum 的 运行 早于范围的最小日期,则不会排除:

SELECT serialnum, timestamp_, passed FROM (
    SELECT serialnum, timestamp_, passed
         , ROW_NUMBER() OVER ( PARTITION BY serialnum ORDER BY timestamp_ ) AS rn
      FROM dbtable
     WHERE TO_DATE('01/07/2015 09:00:00', 'MM/DD/YYYY HH24:MI:SS') <= timestamp_
       AND timestamp_ < TO_DATE('01/07/2015 14:59:59', 'MM/DD/YYYY HH24:MI:SS')
) WHERE rn = 1
 ORDER BY serialnum, timestamp_

window 函数 ROW_NUMBER() 根据最早排序(在 timestamp_ 之后使用 DESC 强制最新)。

希望对您有所帮助。