选择

时间:2015-07-07 16:29:38

标签: sql oracle sum subquery

我有以下声明可以在给定日期范围内给出的数据库中按用户(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,不工作)

我在这里想念的是什么......

1 个答案:

答案 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是一个数字,但并不完全清楚,那么它不应该用引号括起来。

SQL Fiddle demo