首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算搅拌模型

计算搅拌模型
EN

Stack Overflow用户
提问于 2019-01-03 22:54:38
回答 3查看 263关注 0票数 0

我试图分析我们在前一年(2017年)做生意的客户,但现在是今年(2018年)。我怎样才能知道2018年大量涌现在我们身上的客户的名字。我用的是2016年的SSMS。

样本数据:

代码语言:javascript
复制
Client_ID    Client_Name     Order_Date           Revenue         
   214         ssms            2/4/2017             10000
   344         oracle          2/14/2017            9000
   754         postgresql      7/17/2017            15000
   154         toad            9/27/2017            14852
   854         teradata        12/14/2017           54111
   654         sybase          10/25/2017           85477
   214         ssms            3/25/2018            25000
   854         teradata        5/14/2018            35000
   654         sybase          10/24/2018           45000
  .........................................

select client_id, client_name
from my_table
where year(order_date) = 2017
and year(order_date) <> 2018

上面的查询返回2017年的客户,但不知道2018年的数据是否事先被过滤过。

要求取得的成果:

代码语言:javascript
复制
Client_ID         Client_Name
  754             postgresql
  344             oracle
  154             toad
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-03 23:00:27

您可以使用现有的

代码语言:javascript
复制
select client_id, client_name
from T tt
where year(order_date) = 2017
      and not exists(select 1 from t where client_id = tt.client_id and year(order_date) = 2018)

演示

您还可以使用IN()作为

代码语言:javascript
复制
SELECT *
FROM T
WHERE Order_Date >= '2017-01-01'
      AND
      Order_Date <= '2017-12-31'
      AND
      Client_ID NOT IN(
        SELECT Client_ID
        FROM T
        WHERE Order_Date >= '2018-01-01'
              AND
              Order_Date <= '2018-12-31'
      )
票数 2
EN

Stack Overflow用户

发布于 2019-01-03 23:02:20

您可以使用NOT EXISTS和关联子查询。

代码语言:javascript
复制
SELECT t1.client_id,
       t1.client_name
       FROM my_table t1
       WHERE t1.order_date >= '2017-01-01'
             AND t1.order_date < '2018-01-01'
             AND NOT EXISTS (SELECT *
                                    FROM my_table t2
                                    WHERE t2.client_id = t1.client_id
                                          AND t2.order_date >= '2018-01-01'
                                          AND t2.order_date < '2019-01-01');

您还可能希望重写条件,不再在order_date列上使用order_date函数,而是将其与范围进行比较,以便可以为该列使用索引。

票数 1
EN

Stack Overflow用户

发布于 2019-01-03 23:14:18

为了完成这一任务,我通常使用“拥有”子句,尽管如果您有大量的数据要处理,您可能需要一些更有效率的东西。

代码语言:javascript
复制
select client_name, max(year(order_date)) as final_year from my_table group by client_name having max(year(order_date)) = 2018

以上将返回所有客户,最后一次订单是在2018年。

包括附加的“拥有”条件,如:

代码语言:javascript
复制
and min(year(order_date)) < 2018

将不包括2018年第一笔交易的客户。

希望这对你的目的来说足够了。

抱歉没有使用您的确切模式名称等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54030916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档