【发布时间】:2018-11-04 01:11:57
【问题描述】:
我的项目使用的是 Oracle SQL 数据库。我有一个历史表,它每周都会附加任务状态,并且正在尝试查询当前偏离轨道的任务偏离轨道的周数。这是我的源历史表的示例摘录:
ID WEEK ON_TRACK
1 1 N
1 2 Y
1 3 N
1 4 N
1 5 N
2 1 N
2 2 N
2 3 Y
2 4 Y
2 5 N
3 1 N
3 2 N
3 3 Y
3 4 Y
3 5 Y
我希望从最新的追加开始向后返回 ON_TRACK 中连续“N”值的计数。对于上面的示例数据,我希望查询返回:
ID WKS_OFF_TRACK
1 3
2 1
3 0
我已经进行了一些研究,看起来 Tabibitosan 方法是最合乎逻辑的方法,并且我找到了充足的示例来给出符合 1 个标准的最大连续值,但我无法调整以返回符合 2 个条件(ID 和 ON_TRACK)的最新连续值。
这是我目前所拥有的
--this step creates a temp table with unique IDs for each weekly append to the historical table, and a 1 (if ON_TRACK = N) or 0 (if ON_TRACK = Y). This results in the expected info.
WITH HIST_TBL AS (
SELECT DISTINCT(ID),
CASE ON_TRACK
WHEN 'N' THEN 1
ELSE 0
END AS OFF_TRACK,
WEEK
FROM SOURCE_HISTORICAL_TBL
ORDER BY ID,WEEK DESC)
-- end of temp table
--this is where Im struggling I want one line per project number, and the sum of the latest string of 1s (weeks the task has been off track), until a 0 is reached.
SELECT ID,
SUM(OFF_TRACK) AS WKS_OFF_TRACK
FROM (SELECT WEEK,
ID,
OFF_TRACK,
ROW_NUMBER() OVER (ORDER BY WEEK DESC) - ROW_NUMBER() OVER
(PARTITION BY ID,OFF_TRACK ORDER BY WEEK DESC) GRP
FROM HIST_TBL)
GROUP BY ID, GRP
ORDER BY ID;
此代码导致每个项目偏离轨道的所有周的累积总和,对于我的示例数据,这将是:
ID WKS_OFF_TRACK
1 4
2 3
3 2
任何想法我哪里出错了?
【问题讨论】:
标签: sql oracle group-by count partition