oracle-select-rows-group-by基于多列

1bqhqjot  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(270)

我想为一个特定的日期和时间获取重复的行,按这两个行分组 bname 以及 txn_datetxn_date 最多小时分钟(秒不需要匹配)
例如,我获取下面的行 txn_date = 2020/07/28 , txn_type = OPD , payment_mode = CREDIT 以及 inv_num 开始于 AGL 其中,我只需要ID为1-4的行

ID |         txn_date       |   bname        
-----------------------------------------------
 1 | 2020/07/28 10:21:58 PM |  MRS R A W B VERNON
 2 | 2020/07/28 10:21:56 PM |  MRS R A W B VERNON
 3 | 2020/07/28 09:51:58 AM |  MRS TRIDENTZ
 4 | 2020/07/28 09:51:58 AM |  MRS TRIDENTZ
 5 | 2020/07/28 09:49:51 AM |  MRS TRIDENTZ
 6 | 2020/07/28 08:33:14 AM |  MRS TRIDENTZ
 7 | 2020/07/28 08:25:06 AM |  MRS S F D SHERILA
 8 | 2020/07/28 08:11:35 AM |  MRS S F D SHERILA

我使用下面的查询。

select to_char(l.txn_date,'YYYY/MM/DD HH12:MI:SS AM') "DATE",l.bname
from linv l where (bname) IN (select bname from linv
where txn_date like '28-JUL-20%'
group by bname, txn_date
having count(*) > 1) and l.txn_type = 'OPD' and payment_mode = 'CREDIT' 
and inv_num like 'AGL%' 
and txn_date like '28-JUL-20%'
order by l.txn_date desc, l.bname

但这并没有提供所需的输出,因为某些必需的行没有获取。
我试着把分组改成 to_char(txn_date, 'HH24') 但这并不奏效。
我认为 group_by txn_date 有问题,但无法修复。有人能帮忙吗?
谢谢!

8oomwypt

8oomwypt1#

如果您试图根据datetime分组到分钟,您可以使用trunc函数除去秒和毫秒。
https://docs.oracle.com/cd/b28359_01/server.111/b28286/functions209.htm#sqlrf06151
在你的小组里用这个代替

group by bname, to_char(TRUNC(txn_date, 'MI'), 'DD-MON-YYYY HH24:MI:SS')
eqfvzcg8

eqfvzcg82#

exists 你想要什么?

select l.*
from linv l
where exists (select 1
              from linv l2
              where trunc(l2.txn_date) = trunc(l.txn_date) and
                    l2.bname = l.bname
             );

您还可以添加其他过滤器。你的问题表明:

with l as (
      select l.*
      from linv l
      where l.txn_type = 'OPD' and
            l.payment_mode = 'CREDIT' and
            l.inv_num like 'AGL%' 
            l.txn_date >= date '2020-07-28' and
            l.txn_date < date '2020-07-29' 
           )
select l.*
from l l
where exists (select 1
              from l l2
              where trunc(l2.txn_date) = trunc(l.txn_date) and
                    l2.bname = l.bname
             );

或使用窗口功能:

with l as (
      select l.*
      from linv l
      where l.txn_type = 'OPD' and
            l.payment_mode = 'CREDIT' and
            l.inv_num like 'AGL%' 
            l.txn_date >= date '2020-07-28' and
            l.txn_date < date '2020-07-29' 
     )
select l.*
from (select l.*, count(*) over (partition by trunc(txn_date), bname) as cnt
      from l
     )l
where cnt >= 2;

相关问题