当前位置: 首页 > 知识库问答 >
问题:

查找重复项但排除集的查询

归泽宇
2023-03-14

我有一个表,有以下列

Emp_id
Work_date
element

我想要一个查询(下面查询的修改版本),如果上面的表中给定的work_date和员工ID(GROUP BYEMP_ID和WORK_DATE)超过1行,它将返回一行。所以我写了如下查询:

SELECT EMP_ID, WORK_DATE  FROM myTable
where WORK_DATE = :p_WorkDate
GROUP BY EMP_ID, WORK_DATE
HAVING COUNT (1) > 1

例如:

EMP_ID  WORK_DATE
1       1/1/2013
1       1/1/2013
2       1/1/2013

如果我通过1/1/2013 for:p_WorkDate,查询应返回如下:

1    1/1/2013

基本上,我试图找出EMP\u ID和WORK\u DATE是否有超过1行,但还有一个额外的要求,即元素列包含什么-如果它包含一个集合(element1 element2)或(element3 element4)中的值。

附加要求(以下)取决于元素列包含的内容(如果行具有集合中的值)。

1)有2行具有相同的emp_id和work_date,其中一个元素列是element1,另一个元素列是element2(一组element1和元素2)

例如:

EMP_ID  WORK_DATE element
1   1/1/2013  element1
1   1/1/2013  element2

查询不应返回任何行,因为即使有两行,它也是一个集合(element1和elelement2)

2)有2行具有相同的emp_id和work_date,其中一个元素列是element3,另一个元素列是element4(一组element3和元素4)

例如:

EMP_ID  WORK_DATE element
1   1/1/2013  element3
1   1/1/2013  element4      

查询不应该返回任何行,因为即使有两行,它也是一个集合(element3和元素4)

3) 如果有两行具有相同的emp\u id和work\u date,并且不是如上所述的集合,则应返回一行

例如:

EMP_ID  WORK_DATE element
1   1/1/2013  element1
1   1/1/2013  xxx   

(如果元素列有element2而不是element1,则结果相同)

如果我通过1/1/2013 for:p_WorkDate,查询应返回如下:

1    1/1/2013

4)如果有2行以上的emp_id和work_date相同,无论元素列包含什么,都应该返回一行。

例如:

EMP_ID  WORK_DATE element
1   1/1/2013  element1
1   1/1/2013  element2
1   1/1/2013 xxx

如果我通过1/1/2013 for:p_WorkDate,查询应返回如下:

1 1/1/2013

非常感谢。

共有2个答案

鞠征
2023-03-14

这是一个set in-a-set子查询的示例,您可以在have子句中完成所有工作:

SELECT EMP_ID, WORK_DATE
FROM myTable
where WORK_DATE = :p_WorkDate
GROUP BY EMP_ID, WORK_DATE
HAVING sum(case when element not in ('element1', 'element2', 'element3', 'element4')
                then 1 else 0
           end) > 0 or
       (sum(case when element in ('element1', 'element2') > 0 and
        sum(case when element in ('element3', 'element4') > 0
       )

逻辑是。having语句中的第一个子句是关于不在这两个集合中的任何元素的。如果有,则返回一行。

第二个条件是当两个集合都有元素时。这是您也将返回一行的情况。如果所有行都只有一个集合的元素,那么就可以了。

对于有三行重复的情况,您的规则是不明确的,例如两行'element1'和一行element2'。用这个公式就可以了。希望您能看到如何根据您的具体情况扩展having子句。

姬心思
2023-03-14

试试看。。。我想我已经理直气壮了:

select
  emp_id,
  work_date
from (
  select
    emp_id,
    work_date,
    min(element) min_element,
    max(element) max_element,
    count(*) rows_counted
  from
    mytable
  where
    work_date = :p_workdate
  group by
    emp_id,
    work_date
  having
    count (*) > 1)
where
  rows_counted > 2 or
  (min_element,max_element) not in (select 'element1' el1, 'element2' el2 from dual union all
                                    select 'element3' el1, 'element4' el2 from dual)
 类似资料:
  • 问题内容: 当LastDate中存在差异时,以下SQL可用于识别唯一的电话。但是,如果重复的电话具有完全相同的LastDate,则它将不起作用。 任何想法将不胜感激。 问题答案: 更改为。

  • 问题内容: 我有一个数组,正在寻找重复项。 但是,当没有重复项时,此代码不起作用。为什么? 问题答案: On the nose answer.. 编辑后切换回原来的位置,因为我在你正在使用的地方阅读过,最初的问题尚不清楚。还要设置,以将执行时间减半,但仍为O(n 2)。 A faster (in the limit) way 这是一种基于哈希的方法。你需要为自动装箱付款,但是它是O(n)而不是O(

  • 问题内容: 我有一张很大的桌子,上面有关于用户的以下数据。 我想在ssn等于但名称不等于的表中找到所有可能的重复项 我的尝试是: 问题答案: 在SSN上进行分组应该做到这一点 ~~~~ ..或如果每个ssn有很多行,而只想查找重复的名称) 编辑,糟糕,被误解

  • 假设我有一个如下所示的验证表。 在上表中,如果我们观察到场景id 1和3具有相同的验证id 100、101和102。 在这种情况下,我可以说scenario_id=1是scenario_id=3的重复。 我可以得到一个MySql查询来找到这样的重复。 提前谢谢。

  • 我想知道如何实现以下操作:我有两个arraylists,其中的值相互关联。也就是说,同一索引上的arraylists的元素彼此相关。例如:ArrayList1(String ArrayList)=[id1,id2,id3,id2,id2,id1]。ArrayList2(整数ArrayList)=[2,3,2,5,6,3]。 我想创建2个新的arraylists与重复的值不再存在。在上面的例子中,新

  • 我有一个带有ID,姓名和地址字段的员工类。如果两个雇员的 ID 和姓名完全相同,则认为他们是一样的。现在我有一个员工列表,现在我的任务是收集重复的员工。 这是我的员工类代码,带有基于id和name字段重写的hascode和equals方法。 现在我有这个代码可以找到重复的员工 这段代码运行良好,并在我的集合中给出了id为1的雇员。 如何使用Java 8 lamda和streams执行相同的操作?在