【问题标题】:Return each max count of subgroup using oracle-11g使用 oracle-11g 返回子组的每个最大计数
【发布时间】:2014-04-13 08:13:12
【问题描述】:

我有一张桌子

CREATE TABLE table1
(
   from_id varchar2(10),
   to_id varchar2(10),
   b_id varchar2(20) NOT NULL,
   exp_in_date varchar2(20) NOT NULL
);

样本数据:

Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','2','20140203056',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','2','20140203056',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203056',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','2','20140203057',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('2','5','20140203057',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203057',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','2','20140203058',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('2','5','20140203058',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203058',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','2','20140203059',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('2','5','20140203059',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203059',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','2','20140204059',TO_DATE('20140204', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','2','20140204059',TO_DATE('20140204', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','2','20140204059',TO_DATE('20140204', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','2','20140204059',TO_DATE('20140204', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','2','20140204059',TO_DATE('20140204', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203060',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203060',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203060',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203060',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','4','20140203061',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','4','20140203061',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','4','20140203061',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','4','20140203061',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','4','20140203061',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','4','20140203061',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','4','20140203061',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','3','20140203062',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','3','20140203062',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','3','20140203062',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','3','20140203062',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','3','20140203062',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203063',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203063',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203063',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203063',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203064',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203064',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203064',TO_DATE('20140203', 'yyyymmdd'));
Insert into TABLE1 (FROM_ID,TO_ID,B_ID,EXP_IN_DATE) values ('5','1','20140203064',TO_DATE('20140203', 'yyyymmdd'));

我想得到每个 '4' b_id 的最大 count(*),每个 4 b_id 代表一个小时内的交易,比方说

20140203056 到 20140203059

例如预期结果

Date-hr                     from_id to_id   count(no_record)
------------------------------------------------------------
February, 03 2014 14:00     2       5       1   
February, 03 2014 14:00     5       1       1   

我可以进行简单的分组。我想我可以在 PLSQL 中对其进行编码,但是该查询的性能非常重要。如果没有更好的解决方案,我想执行for-loop和if(greater)而不是比较。

【问题讨论】:

  • 我不明白“每 '4' b_id 的最大计数 (*)”。另外我不明白“每个 4 b_id 代表一个小时内的交易”
  • 对不起,我的演讲很糟糕。它是关于 + 获取下一个“4”“b_id”的最大值,例如事务 5,2 的最大 from_id 和 to_id 为 9 - 对于 b_id(1) + 事务 5,2 的最大 from_id 和 to_id 为 3 - - 对于 b_id(2),事务 5,2 的最大 from_id 和 to_id 为 1 -- 对于 b_id(3),事务 5,2 的最大 from_id 和 to_id 为 10 -- 对于 b_id(4)
  • bid(1,4) 子组的最大交易价值(我正在寻找)是 10 (b_id = 4),尽管 b_id(5) 的下一个值是 99,最大 from_id并且事务 5,2 的 to_id 是 99 -- 对于 b_id(5) 您可以认为 b_id 来自 yyyyMMddXXX - 其中 XXX 是 hour 中每个事务的序列
  • 对不起,我还是不明白。 “事务 5,2 的最大 from_id 和 to_id 为 9” 什么是事务 5,2?它是否由带有from_id=5 and to_id=2 的行表示?表中所有行的max(from_id)5,表中所有行的max(to_id) 也是5。那么最大值是 9 是多少?请编辑 OP 以使其更清楚,然后添加大量 cmets 更有用。我认为详细说明您的示例是有道理的。您如何计算从“20140203056 到 20140203059”的交易的这个“预期结果”。
  • 很抱歉,我不知道如何在评论中添加换行符。是的。事务 5,2 表示从 from_id 5 到 to_id 2 最后一个只是一个示例,用于解释每个 '4 b_id' 的“最大计数(*)”。

标签: sql oracle oracle11g group-by aggregate-functions


【解决方案1】:

你的意思是这样的吗?

select count(*) countx,from_id,to_id,exp_in_date
from table1
group by from_id,to_id,exp_in_date;

fiddle

【讨论】:

  • 结果为 (select b_id, FROM_ID, TO_ID, count(*) as x from table1 group by FROM_ID, TO_ID, B_ID )
  • select to_date(to_number(substr(b_id, 1,8)), 'yyyymmdd') as mydate, b_id, FROM_ID, TO_ID, x as "No of record" ,trunc(to_number(substr( b_id, 9,3)) / 4, 0) 作为时钟,row_number() over ( 分区 to_number(substr(b_id, 1,8)), trunc(to_number(substr(b_id, 9,3)) / 4, 0), FROM_ID, TO_ID order by x desc ) tom from results
猜你喜欢
  • 2018-10-01
  • 1970-01-01
  • 2017-04-24
  • 2019-10-18
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 2019-10-21
相关资源
最近更新 更多