我有一张表格,上一年的第一年至上个月,即2015年1月至2016年9月。
我必须在下表i中进行两个月的比较。例如,从{1}中选择1月份的所有行,除了表1中2月份的行;从table1
.....
直到上个月才到达。
在这里,我需要每两个月进行一次有条件的联合比较直到上个月。
样品:
table1
示例数据:
select col1,col2 from table1 where month=jan 2015
except
select col1,col2 from table1 where month=feb 2015
union
select col1,col2 from table1 where month=feb 2015
except
select col1,col2 from table1 where month=mar 2015
.
.
.
union
select col1,col2 from table1 where month=aug 2016
except
select col1,col2 from table1 where month=sep 2016
所以这里的产品p1存在于jan而不再存在于2015年2月。所以我需要Jan的所有产品在2015年2月不存在....
有人可以建议解决方案吗?
答案 0 :(得分:0)
首先,您似乎将所有数据都放在一个表中。在这种情况下,通常不需要union all
(及相关操作)。
其次,您似乎想要一个月但不是下个月的行。
我会这样想:
select t.*
from table1 t
where not exists (select 1
from table1 t2
where t2.col1 = t.col1 and t2.col2 = t.col2 and
t2.month = t.month + 1
) and
month >= jan 2015 and
month <= sep 2016;
当然,您还没有显示数据实际上是什么样子,所以我不知道t.month + 1
究竟应该是什么样子。但这个想法是在'&#34;月&#34;添加一个月。值。
答案 1 :(得分:0)
请检查一下。
select *
from (select t.*
,max (sale_month) over (partition by customer_id,product_id,sale_year) as last_sale_month_of_year
from t
) t
where t.last_sale_month_of_year in (1,12) -- Jan,Dec
or ( sale_year = year(getdate())
and last_sale_month_of_year = moth(getdate())
)
;
select *
from (select t.*
,max (sale_month) over (partition by customer_id,product_id,sale_year) as last_sale_month_of_year
from t
) t
where t.last_sale_month_of_year not in (1,12) -- Jan,Dec
and ( sale_year <> year(getdate())
or last_sale_month_of_year <> moth(getdate())
)
;