【问题标题】:Querying for result in one time window that doesn't exist in another查询一个时间窗口中不存在于另一个时间窗口中的结果
【发布时间】:2018-05-17 19:10:21
【问题描述】:

以下查询有效,但我想稍微修改一下。

事实上,它从客户表中选择所有客户,这些客户不在此文件中先前函数的数组中(因此是'NOT IN($dealerNum')。它对所有其他客户运行查询,如果他们在过去 6 个月之前的 12 个月内有订单,则检索他们的号码(我在 18 个月的窗口中工作)。

我需要稍微改变一下。我仍然想在任何不在前一个数组中的客户上​​运行它。但是,我想检索过去 6 个月而不是之前 12 个月有订单的任何客户的数量。基本上表明他们至少在那一年/ 12 个月内处于活跃状态,并且在过去 6 个月内一直处于活跃状态。

希望这是有道理的。这是现有的查询,我只是不确定修改 WHERE 以处理此问题的最佳/最合乎逻辑的方式

SELECT c.customerNumber
  FROM Customers C
INNER JOIN Orders G ON C.CustomerNumber = G.Customer
WHERE c.customerNumber NOT IN ($dealerNum)
    AND C.date BETWEEN CURRENT_DATE - 18 MONTHS AND CURRENT_DATE - 6 MONTHS
GROUP BY C.customerNumber
    HAVING COUNT(*) > 0

【问题讨论】:

  • 你的意思是C.date 我希望日期来自Orders 表-即一个订单日期
  • 啊,是的,很抱歉你是对的

标签: sql db2


【解决方案1】:

我会这样写

SELECT c.customerNumber
  FROM Customers C
WHERE c.customerNumber NOT IN ($dealerNum)
AND   c.customerNumber     IN (SELECT Customer FROM Orders where Date BETWEEN CURRENT_DATE -  6 MONTHS AND CURRENT_DATE           )
AND   c.customerNumber NOT IN (SELECT Customer FROM Orders where Date BETWEEN CURRENT_DATE - 18 MONTHS AND CURRENT_DATE - 6 MONTHS)

【讨论】:

  • 非常清晰的写法,虽然它确实需要对 Orders 进行两次表扫描
  • 这将取决于您在“订单日期”列上拥有的索引。查看访问计划。
  • 另一个答案将对Orders 表中的所有行进行分组,因此可能会比我怀疑的版本慢
【解决方案2】:
select  c.customerNumber
from    Customers c
join    Orders o
on      c.CustomerNumber = o.Customer
where   c.customerNumber not in ($dealerNum)
group by
        c.customerNumber
having  count(case when o.date > current date - 6 months then 1 end) > 0
        and count(case when o.date between current date - 18 months and 
                            current_date - 6 months then 1 end) = 0

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 2018-01-08
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2021-10-15
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多