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
强制最新)。
希望对您有所帮助。
我需要从 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
强制最新)。
希望对您有所帮助。