Select 中子查询的 Oracle Sum

Oracle Sum of Subquery in Select

我有以下语句可以很好地计算给定日期范围内给定数据库中用户 (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

这有效,return就像这样:

User    SignedNotes
Jim     5
Laura   3

我需要添加一个列来计算他们是最后一个用户签名的笔记的数量。我尝试了下面的代码和一些变体,但不断收到 "missing expression" 错误。

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

这个错误,但是应该return:

User    SignedNotes    FinalNotes
Jim     5              2
Laura   3              1

table结构比较乱,但基本上:

GRIDTEXT         APPLICATION_ID    UPDATE_DT         MISC1          EXAMID
<Name of User>   <Note Type (#)>   <Date of Action>  <ActionType>   <Encounter>

我需要知道每个用户对(工作)执行了 "SIGNED" 操作的笔记有多少,以及他们是最后登录的用户有多少笔记(按 EXAMID 分组时最后 UPDATE_DT , 不工作)

我在这里错过了什么...

您可以使用解析 row_number() function as TheMadDBA hinted; 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 是一个不完全清楚的数字,则不应将其用引号引起来。

SQL Fiddle demo