我试图分析我们在前一年(2017年)做生意的客户,但现在是今年(2018年)。我怎样才能知道2018年大量涌现在我们身上的客户的名字。我用的是2016年的SSMS。
样本数据:
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年的数据是否事先被过滤过。
要求取得的成果:
Client_ID Client_Name
754 postgresql
344 oracle
154 toad发布于 2019-01-03 23:00:27
您可以使用现有的
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()作为
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'
)发布于 2019-01-03 23:02:20
您可以使用NOT EXISTS和关联子查询。
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函数,而是将其与范围进行比较,以便可以为该列使用索引。
发布于 2019-01-03 23:14:18
为了完成这一任务,我通常使用“拥有”子句,尽管如果您有大量的数据要处理,您可能需要一些更有效率的东西。
select client_name, max(year(order_date)) as final_year from my_table group by client_name having max(year(order_date)) = 2018以上将返回所有客户,最后一次订单是在2018年。
包括附加的“拥有”条件,如:
and min(year(order_date)) < 2018将不包括2018年第一笔交易的客户。
希望这对你的目的来说足够了。
抱歉没有使用您的确切模式名称等。
https://stackoverflow.com/questions/54030916
复制相似问题