Sql comparaison嵌套在一列上

时间:2017-06-29 19:50:31

标签: sql-server group-by distinct

想象一下一张桌子:

 ID  Month     Year  Value 1 
  1  May        17   58      
  2  June       09   42      
  3  December   18   58      
  4  December   18   58     
  5  September  10   84      
  6  May        17   42      
  7  January    16   3       

我想返回与Value 1不同的月份和年份共享的所有数据。因此,在我们的示例中,我只想返回1和6但不返回3和4或任何其他条目。

有办法做到这一点吗?我正在考虑将distinct和group by组合在一起,但似乎无法为SQL提供正确的答案。

感谢。

3 个答案:

答案 0 :(得分:1)

对于每一行,您可以使用OVER子句检查其组中的聚合。例如:

create table #t(id int, month varchar(20), year int, value int)

insert into #t(id,month,year,value)
values 
 (1,'May'      ,17,  58      ),
 (2,'June'     ,09,  42      ),
 (3,'December' ,18,  58      ),
 (4,'December' ,18,  58      ),
 (5,'September',10,  84      ),
 (6,'May'      ,17,  42      ),
 (7,'January'  ,16,  3       );


 with q as
 (
     select *, 
            min(value) over (partition by month,year) value_min,
            max(value) over (partition by month,year) value_max
     from #t
)
select id,month,year,value
from q
where value_min <> value_max;

答案 1 :(得分:1)

可以在没有分组的情况下完成,但使用简单的自联接:

    select distinct t1.*
    from [Table] t1
    inner join [Table] t2 on
        t1.Month = t2.Month
        and t1.Year = t2.Year
        and t1.Value_1 <> t2.Value_1

您可以找到一些信息和自我加入示例herehere

答案 2 :(得分:0)

如果我正确理解了您的问题,那么您正在寻找HAVING keyword

如果您GROUP BY Month, Year, Value_1 HAVING COUNT(*) = 1,您将获得没有其他事件的所有Month,Year和Value_1组合。