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

时间:2015-01-08 17:45:26

标签: c++ sql oracle qt5

我需要从特定日期范围的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命令完成此操作?

1 个答案:

答案 0 :(得分:2)

这将在日期范围内首次运行(仅)运行。如果特定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_

窗口函数ROW_NUMBER()按最早排名(DESC之后使用timestamp_强制最新)。

希望这有帮助。