查询以返回在所有行中对于一列的每个不同值具有相同值的行值

Posted

技术标签:

【中文标题】查询以返回在所有行中对于一列的每个不同值具有相同值的行值【英文标题】:Query to return row values which has same values in all the rows for each different value of one column 【发布时间】:2020-03-13 08:15:56 【问题描述】:

例如,我有以下数据:

我只想显示第 2、3、5 行,因为 (01, 02, 03) 中的每个 A6 的所有 A1、A2、A3、A4 值都相同(每行必须有每个 A6 值)。 所以我只想排除第 4 列。

【问题讨论】:

【参考方案1】:

我了解到,您希望记录的值 123 都可用于给定的 (a1, a2, a3, a4) 元组。

这是一种通过聚合子查询连接表的方法:

select t.*
from mytable t
inner join (
    select a1, a2, a3, a4
    from mytable t1
    where a6 in (1, 2, 3)
    group by a1, a2, a3, a4
    having count(distinct a6) = 3
) g 
    on  g.a1 = t.a1 
    and g.a2 = t.a2 
    and g.a3 = t.a3 
    and g.a4 = t.a4

您还可以使用相关子查询进行过滤:

select t.*
from mytable t
where (
    select count(distinct a6) 
    from mytable t1
    where t1.a1 = t.a1 and t1.a2 = t.a2 and t1.a3 = t.a3 and and t1.a4 = t.a4
) = 3

【讨论】:

您好,感谢您的回复,我尝试根据自己的数据进行操作:我有以下查询:但我收到如下错误:ORA-00904: "G"."UPPER" : 无效标识符 00904. 00000 - “%s: 无效标识符” *原因:*操作: 因为我有加入的条件:t.upper(SUBSTR(T_ACTIVO.GENERIC_FIELD1,8,2)) = g.upper(SUBSTR(T_ACTIVO.GENERIC_FIELD1,8,2))也许是因为它是一个字符串?【参考方案2】:

如果你想要 A2/A3/A4 有重复的行,那么你可以使用窗口函数:

select t.*
from (select t.*,
             count(distinct (case when a6 in (1, 2, 3) then a6 end) over (partition by a2, a3, a4) as cnt
      from t
     ) t
where cnt > 1;

【讨论】:

以上是关于查询以返回在所有行中对于一列的每个不同值具有相同值的行值的主要内容,如果未能解决你的问题,请参考以下文章

具有 1 个不同的列和来自另一列的总和值 [关闭]

在保留列的同时计算具有相同值的行

修改列表视图查询集以汇总包含具有相同值的列的表

SQL如何查询出某一列中不同值出现的次数?

根据来自另一列的不同值计算值

SqlSever基础 MIN 查看一个表中具有特定内容的行中某一列的最小值