oracle 如何查找除单列外具有相似列的行

raogr8fs  于 2023-05-16  发布在  Oracle
关注(0)|答案(4)|浏览(179)

我正在尝试从下表中查找行

T_Date     | Code  | TWS    
2018-01-01 | A0001 | TRDR001
2018-01-01 | A0001 | TRDR002
2018-01-02 | A0002 | TRDR001
2018-01-02 | A0003 | TRDR001
2018-01-03 | A0004 | TRDR001
2018-01-04 | A0004 | TRDR002
2018-01-05 | A0006 | TRDR001
2018-01-05 | A0006 | TRDR003

期望的结果是找到那些在同一日期具有不同TWS的行

T_Date     | Code  | TWS
2018-01-01 | A0001 | TRDR001
2018-01-01 | A0001 | TRDR002
2018-01-05 | A0006 | TRDR001
2018-01-05 | A0006 | TRDR003

我试过一些方法,但都没有用。

select t.T_Date,t.Code,t.TWS
from trades t 
group by t.T_Date,t.Code,t.TWS
having COUNT(t.TWS)>1

谁能帮帮我?

bbuxkriu

bbuxkriu1#

我们可以使用Exists操作符:

Select T_Date, Code, TWS
From table_name T
Where Exists(
  Select 1 From table_name D
  Where D.T_Date = T.T_Date And D.Code = T.Code And D.TWS <> T.TWS)
Order By T_Date, Code, TWS

Demo

pobjuy32

pobjuy322#

我会使用一个self-join,如下所示:

SELECT T_Date, Code, TWS
FROM trades t1
INNER JOIN trades t2 
ON t1.T_Date = t2.T_Date AND t1.Code = t2.Code
WHERE t1.TWS <> t2.TWS;
fnx2tebb

fnx2tebb3#

这段代码有用吗?

select distinct T_Date, Code, tws
from trades 
where (T_Date, Code) in 
(    
      select t.T_Date, t.Code 
      from trades t
      group by 
      t.T_Date,t.Code having COUNT(*)>1
)
order by t_date;

Demo

dgsult0t

dgsult0t4#

期望的结果是找到那些在同一日期具有不同TWS的行
我建议使用窗口函数,而不是子查询或自连接。这是一次表扫描(而其他方法需要两次),因此效率更高。
我们可以只比较t_date, code的分区上tws的最小值和最大值;如果它们不匹配,那么我们保留分区的所有行:

select t.*
from (
    select t.*,
        min(tws) over(partition by t_date, code) min_tws,
        max(tws) over(partition by t_date, code) max_tws
    from mytable t
) t
where min_tws <> max_tws

相关问题