SQL Server 中的条件联合,直到到达特定日期

Posted

技术标签:

【中文标题】SQL Server 中的条件联合,直到到达特定日期【英文标题】:Conditional union in SQL Server until it reaches a specific date 【发布时间】:2016-10-29 12:51:08 【问题描述】:

我有一张表格,日期从前一年的第一天到上个月,即 2015 年 1 月到 2016 年 9 月。

我必须在下面的同一张表中进行两个月的比较 i。 e.,从table1中选择一月份的所有行,除了表1中二月份的行;从table1.....

中选择 2 月份的所有行,除了 3 月份的行

直到上个月。

在这里我需要对每两个月的比较进行条件联合,直到上个月。

示例:

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

样本数据:

Customer    Product       date       amount
-------------------------------------------    
a           p1            1/31/2015  $12
a           p2            1/31/2015  $13
a           p2            2/28/2015  $1

所以这里的产品 p1 存在于 1 月,而 2015 年 2 月不再存在。所以我需要 2015 年 2 月不存在的所有 1 月产品 ....

谁能提出解决方案?

【问题讨论】:

请编辑您的问题并提供示例数据和所需的结果。 这是有道理的。您真正想在商业上实现什么目标? 一些数据清理 col1,col2 可以在请求的结果集中重复吗?例如,如果一个组合存在于一月,它是否也存在于五月?另外,它可以在一月份存在两次吗?我们要消除所有重复项吗? 不,每个产品和客户只有一个组合存在一个月。 【参考方案1】:

首先,您似乎将所有数据都放在一个表中。在这种情况下,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;

当然,您还没有展示 data 的实际样子,所以我不知道 t.month + 1 真正应该是什么样子。但想法是在“月”值上加一个月。

【讨论】:

添加了示例数据。能否请您指教。 @bipro 。 . .这个答案几乎可以满足您的要求。您只需修复日期算术以匹配您的数据。【参考方案2】:

请检查一下。

这些都是好东西

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()) 
            )
;

【讨论】:

以上是关于SQL Server 中的条件联合,直到到达特定日期的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:对列的每个组值求和(或差),直到在另一列上满足条件

联合所有在 SQL Server 中的视图性能问题

sql如何一对多联合查询

从上面的值填充列值,直到它在SQL Server中达到新值

sql server更新查询中的if条件

如何提高SQL Server大数据条件下的查询速度?