从表中查找重复记录
您好我正在使用以下查询找到表的重复记录
SELECT pm_no, revision,gen_date, count(*)
FROM calendar_plan_tab
WHERE gen_date IS NOT NULL AND gen_type='1'
Group by pm_no, revision,gen_date
HAVING COUNT(*) > 1;
gen_date
的格式为'11/3/2003 8:00:00 AM'
。但是在分组时,我需要仅考虑gen_date
列的日期而不考虑时间字段。
示例:
'11 / 3/2003'在上面。
我能尝试这种方法的最有效方法是什么?
答案 0 :(得分:3)
截断日期有效地删除了时间元素。但是GROUP BY子句中的列必须与投影中的非聚合列匹配,因此您还需要在SELECT子句中截断gen_date
:
SELECT pm_no, revision, trunc(gen_date) as gen_date, count(*)
FROM calendar_plan_tab
WHERE gen_date IS NOT NULL AND gen_type='1'
Group by pm_no, revision,trunc(gen_date)
HAVING COUNT(*) > 1;
"我们还有其他方法可以选择原始的gen_date。"
带有分析count()
的内联视图如何在主查询中用作过滤器?
select * from (
SELECT pm_no, revision, gen_date
, count() over (partition by pm_no, revision, trunc(gen_date)) as gen_date_cnt
FROM calendar_plan_tab
WHERE gen_date IS NOT NULL AND gen_type='1'
)
where gen_date_cnt > 1
;
根据您的数据和您的确切要求,您可能需要在外部投影中使用DISTINCT。
select distinct pm_no, revision, gen_date, gen_date_cnt from (
....
答案 1 :(得分:1)
您可以这样执行:
SELECT pm_no, revision,to_char(gen_date,'dd/mm/yyyy'), count(*)
FROM
calendar_plan_tab
WHERE gen_date IS NOT NULL AND gen_type='1' Group by pm_no,
revision,to_char(gen_date,'dd/mm/yyyy') HAVING COUNT(*) > 1;