ORACLE:使用RANK()和Count(条件)

时间:2018-03-15 17:10:10

标签: sql oracle

我目前正在尝试编写一个Oracle查询,该查询获取每个用户每小时的分配数量。我已经提出了以下内容,就是这样做的。

SELECT DISTINCT
    USER_CODE, 
    TO_CHAR(TAUDIT.ENTERED, 'HH24') Hour, 
    COUNT(TO_CHAR(TAUDIT.ENTERED, 'HH24')) OVER (PARTITION BY TO_CHAR(TAUDIT.ENTERED, 'HH24'), USER_CODE ORDER BY TO_CHAR(TAUDIT.ENTERED, 'HH24')) Allo_Count
FROM TAUDIT
WHERE TAUDIT.ACTION LIKE 'Job Allocated event: All%'
AND TO_CHAR(TAUDIT.ENTERED, 'DD.MM.YY') = TO_CHAR(( SYSDATE - INTERVAL '1' day), 'DD.MM.YY')

这将生成以下格式的列表:

User_Code    Hour    Allo_Count
---------    ----    ----------
CE           09      1
TB           09      3
CE           10      1
TB           10      4

我现在想要实现的是通过Allo_Count对结果进行排名的能力,这样我就可以选择每小时最高的计数。由于我对oracle的经验不多,我一直在浏览无数的帖子以及Oracle在线文档,试图理解并解决这个问题,但我似乎无法解决这个问题。通过排名在订单中使用COUNT()

我在以下行中添加了查询以尝试在输出中获取RANK

Rank() OVER (Partition by TO_CHAR(TAUDIT.ENTERED, 'HH24') Order by COUNT(TO_CHAR(TAUDIT.ENTERED, 'HH24'))DESC) as 'Allo_Rank'

然而,这给了我一个"不是单组的功能"错误,显然这不是道路。从文章和帖子中我已经读过,我很确定一旦我解决了这个问题,我可以用

来包围查询
SELECT * FROM (QUERY) WHERE Allo_Rank = 1

但它首先要克服这个障碍。任何有关如何完成此查询的建议或提示都表示赞赏,因为现在,我的头脑已经炒了!

2 个答案:

答案 0 :(得分:1)

您为什么使用#!/usr/bin/perl use strict; use warnings; my @words; while(<>) { @words = split(" "); if (scalar @words > 10 && $words[11] =~ /^-?\d*\.?\d+$/) { print $words[11] . "\n"; } } ?使用select distinct。并且不要使用字符串进行日期比较。所以,这似乎是你想要的:

group by

排名:

SELECT USER_CODE, TO_CHAR(t.ENTERED, 'HH24') Hour, 
       COUNT(*) as Allo_Count
FROM TAUDIT t
WHERE t.ACTION LIKE 'Job Allocated event: All%' AND
      TRUNC(t.ENTERED) = TRUNC(SYSDATE - INTERVAL '1' day)
GROUP BY USER_CODE, TO_CHAR(t.ENTERED, 'HH24');

答案 1 :(得分:0)

根据戈登的回答,我已经解决了这个问题,包括&#34; Partition By&#34;在查询中。以下是更新的查询:

SELECT USER_CODE, TO_CHAR(t.ENTERED, 'HH24') Hour, 
   COUNT(*) as Allo_Count,
RANK() OVER (PARTITION BY TO_CHAR(t.ENTERED, 'HH24') ORDER BY COUNT(*)) as ranking
FROM TAUDIT t
WHERE t.ACTION LIKE 'Job Allocated event: All%' AND
  TRUNC(t.ENTERED) = TRUNC(SYSDATE - INTERVAL '1' day)
GROUP BY USER_CODE, TO_CHAR(t.ENTERED, 'HH24')

提供以下结果集

User    Hour    Count    Ranking
----    ----    -----    -------
CE      07       1        1
TB      09       1        1
CE      09       3        2
TB      10       1        1
CE      10       4        2

希望这是正确的方法,但如果没有,请随时告诉我