我有以下声明可以在给定日期范围内给出的数据库中按用户(GRIDTEXT)计算已签名笔记的数量:
SELECT
GRIDTEXT "User",
COUNT(GRIDTEXT) "SignedNotes"
FROM CAPTURED_ELEMENT CE
WHERE APPLICATION_ID = '8'
AND UPDATE_DT BETWEEN '01-JUL-2015' AND '05-JUL-2015'
AND MISC1 = 'SIGNED'
GROUP BY GRIDTEXT
这样工作并返回如下:
User SignedNotes
Jim 5
Laura 3
我需要添加一个列,用于计算最后一个用户签名的备注数量。我已经尝试了下面的代码和一些变化,但继续得到"缺少表达式"错误。
SELECT
GRIDTEXT "User",
COUNT(GRIDTEXT) "SignedNotes",
SUM(SELECT COUNT(CX.GRIDTEXT)
FROM CAPTURED_ELEMENT CX
WHERE CX.EXAMID = CE.EXAMID
AND APPLICATION_ID = '8'
AND ROWNUM = 1
AND CX.GRIDTEXT = CE.GRIDTEXT
ORDER BY UPDATE_DT DESC) "FinalNotes"
FROM CAPTURED_ELEMENT CE
WHERE APPLICATION_ID = '8'
AND UPDATE_DT BETWEEN '01-JUL-2015' AND '05-JUL-2015'
AND MISC1 = 'SIGNED'
GROUP BY GRIDTEXT
此错误,但应该返回:
User SignedNotes FinalNotes
Jim 5 2
Laura 3 1
表结构很乱,但基本上是:
GRIDTEXT APPLICATION_ID UPDATE_DT MISC1 EXAMID
<Name of User> <Note Type (#)> <Date of Action> <ActionType> <Encounter>
我需要知道每个用户执行了多少笔记&#34; SIGNED&#34;对(工作)的操作,以及他们是最后一个登录用户的注释(按EXAMID分组时最后UPDATE_DT,不工作)
我在这里想念的是什么......
答案 0 :(得分:1)
您可以使用分析row_number()
function作为TheMadDBA暗示; Oracle says that is superior to rownum
,你还没有正确使用它。
这会为每个考试ID记录分配一个行号,最新编号为1.根据您的有限样本以及您尝试子查询的方式,这应该超出您查询的范围,所以我已经包含了内联视图中日期范围的下端(因为之前的任何内容仍然不相关),以及外部查询中范围的上端。因此,最近的日期可以在7月5日之后。外部查询使用行号仅计算最近的记录 - 因为为该检查分配的行号为1。
SELECT
GRIDTEXT "User",
COUNT(GRIDTEXT) "SignedNotes",
COUNT(CASE WHEN RN = 1 THEN GRIDTEXT END) "FinalNotes"
FROM (
SELECT CE.*,
ROW_NUMBER() OVER (PARTITION BY EXAMID ORDER BY UPDATE_DT DESC) RN
FROM CAPTURED_ELEMENT CE
WHERE APPLICATION_ID = '8'
AND UPDATE_DT >= DATE '2015-07-01'
)
WHERE UPDATE_DT <= DATE '2015-07-05'
AND MISC1 = 'SIGNED'
GROUP BY GRIDTEXT
ORDER BY GRIDTEXT;
User SignedNotes FinalNotes
----- ----------- ----------
Jim 5 2
Laura 3 1
你说你在实际代码中提供的日期有所不同,但我总是在这里使用日期文字。此外,如果application_id
是一个数字,但并不完全清楚,那么它不应该用引号括起来。