我有一个表,有以下列
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
非常感谢。
这是一个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子句。
试试看。。。我想我已经理直气壮了:
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执行相同的操作?在