我需要从特定日期范围的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命令完成此操作?
答案 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_
强制最新)。
希望这有帮助。