想象一下一张桌子:
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提供正确的答案。
感谢。
答案 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
答案 2 :(得分:0)
如果我正确理解了您的问题,那么您正在寻找HAVING keyword。
如果您GROUP BY Month, Year, Value_1 HAVING COUNT(*) = 1
,您将获得没有其他事件的所有Month,Year和Value_1组合。