我目前正在尝试编写一个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
但它首先要克服这个障碍。任何有关如何完成此查询的建议或提示都表示赞赏,因为现在,我的头脑已经炒了!
答案 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
希望这是正确的方法,但如果没有,请随时告诉我