Oracle SQL - 比较多行与日期

Posted

技术标签:

【中文标题】Oracle SQL - 比较多行与日期【英文标题】:Oracle SQL - Comparing Multiple Rows with Dates 【发布时间】:2013-08-23 18:43:13 【问题描述】:

我正在使用 Oracle SQL。假设我有一张列出以下内容的表格。

表格

PurchaseID    CustID      Location       Date  
    1            1           A        8/23/2013 12:00:00 AM  
    2            1           B        8/15/2013 12:00:00 AM  
    3            2           A        5/15/2013 12:00:00 AM  
    4            2           B        1/01/2005 12:00:00 AM  
    5            3           A        1/15/2001 12:00:00 AM  
    6            3           A        1/30/2001 12:00:00 AM  
    7            3           B        8/23/2013 12:00:00 AM  
    8            4           A        5/05/2012 12:00:00 AM
    9            4           B        8/15/2010 12:00:00 AM
    10           4           A        9/20/2008 12:00:00 AM  

我正在尝试编写一个查询来比较客户的购买情况,以便输出是特定客户在 2 年内在两个不同地点进行购买的每个实例。我在 CustID=3 和 CustID=4 类型的情况下特别受挫,其中位置/日期的组合很困难。查询的输出应如下所示。

PurchaseID    CustID      Location       Date  
    1            1           A        8/23/2013 12:00:00 AM  
    2            1           B        8/15/2013 12:00:00 AM   
    8            4           A        5/05/2012 12:00:00 AM
    9            4           B        8/15/2010 12:00:00 AM
    10           4           A        9/20/2008 12:00:00 AM

在输出中,CustID=1 的购买被退回,因为它们在 2 年内位于不同的位置。 CustID=2 被丢弃,因为它们不在 2 年内。 CustID=3 在 2 年内有两次购买,但是因为在同一个位置而被丢弃。并保留 CustID=4 的购买,因为购买 8 和 9 在 2 年内且在不同的位置,而 9 和 10 在 2 年内且在不同的位置(我希望保留这些,尽管 8 和 10 在同一位置并且10 年内)。

注意:日期列具有 Oracle SQL 的“日期”数据类型。

一如既往,我们将不胜感激任何帮助/指导。

【问题讨论】:

【参考方案1】:

您可以将搜索限制为下一个或上一个位置与当前位置不同的情况。然后看时间差来选择行。

这会大量使用lag()lead()

select t.PruchaseId, t.CustId, t.Location, t.Date
from (select t.*,
             lag(location) over (partition by CustId order by Date) as prevloc,
             lead(location) over (partition by CustId order by Date) as nextloc,
             lag(date) over (partition by CustId order by Date) as prevdate,
             lead(date) over (partition by CustId order by Date) as nextdate
      from t
     ) t
where ((prevloc <> location) and (add_months(prevdate, 2*12) > date)) or
      ((nextloc <> location) and (add_months(date, 2*12) > nextdate));

【讨论】:

以上是关于Oracle SQL - 比较多行与日期的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 中比较日期与 sysdate

日期比较返回异常结果 - SQL Oracle

oracle sql日期比较

Sql字符串与时间比较问题

在 Oracle SQL 中比较日期

Oracle两个日期类型字段怎么比较大小