通过列中的更改在SQL中进行分组

时间:2017-12-27 09:38:02

标签: sql oracle

从表中查找重复记录

您好我正在使用以下查询找到表的重复记录

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'在上面。

我能尝试这种方法的最有效方法是什么?

2 个答案:

答案 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;