【问题标题】:I am struggling to output the correct SQL code on a simple query我正在努力在一个简单的查询中输出正确的 SQL 代码
【发布时间】:2020-01-06 22:44:09
【问题描述】:

有一个具有以下属性的表: 订单:order_id、order_item_id、customer_id、日期、product_id、收入

我需要回答以下问题: 我们在 2018 年获得了多少新客户。(如果客户首次购买,那么我们称他们为新客户(仅针对该订单)?

我写了以下查询:

Select Count(customer_id) as New_Customers From Order
Where date < 2019-01-01 AND NOT date < 2018-01-01
Group by customer_id

分配这个的人看了看,告诉我需要为新客户创建一个过滤器。我认为“Where”子句完成了这一点,但我想没有。

任何帮助将不胜感激。

【问题讨论】:

  • 2 您的查询有问题 1)您计算的是订单而不是客户(计数(不同会更好)2)您没有过滤掉订单超出您的日期范围的客户,我不鼓励在这种情况下使用 NOT,
  • 我可以想象为什么 order_id 可能会出现在 order_items 表中,但我无法想象为什么 order_item_id 会出现在 orders 表中
  • 找出你正在使用的RDBMS,然后查看meta.stackoverflow.com/questions/333952/…

标签: mysql sql oracle sqlite


【解决方案1】:

我认为这就是你想要实现的目标。

select count(customer_id) as New_Customers from Orders
Where customer_id not in (select customer_id from Orders Where date < '2018-01-01')
and year(date) = '2018'

【讨论】:

  • 您在 EXISTS 子句中缺少连接条件
  • @Tejash,感谢您的检查,我将其改为使用 NOT IN。
【解决方案2】:

解决方案是查找每个客户的第一个日期并检查它是否在给定的日期范围内。

  • 要找出最短(最早)的购买日期,我们可以按customer_id 分组并使用MIN(date)
  • 但诀窍是我们不能应用WHERE 子句,因为GROUP BY 子句在WHERE 子句之后执行,因此使用WHERE 子句将删除实际记录并且数据将不合适。所以使用HAVING 子句过滤掉分组结果。
SELECT 
    customer_id AS New_Customers, 
    MIN(`date`) First_Purchase_Date
FROM order 
GROUP BY customer_id
HAVING MIN(`date`) BETWEEN '2018-01-01' AND '2019-01-01';

【讨论】:

  • @jacob,如果它解决了你的问题,请接受答案:)
【解决方案3】:
select count(customer_id) as New_Customers from
(
Select
rank() over (partition by customer_id order by date asc) as purchase_rank
,customer_id
,date
From Order
) as ranked_orders
where date between '2018-01-01' and '2019-01-01'
and purchase_rank = 1

我想你想要像上面这样的东西。您必须创建一个按 customer_id 分区并按日期升序排序的排名,以便每个客户首次购买的排名为 1。然后您只需在 2018 年获取排名为 1 的订单并计算这些订单。

此外,您可以将 where 子句更改为 purchase_rank > 1 并在 select 子句中将其更改为 count(distinct customer_id) ,然后您就可以得到数字作为回头客(而不是新客户)进行购买的客户。

【讨论】:

    【解决方案4】:

    最简单的查询是使用 EXISTS,如下所示:

    select count(distinct O1.customer_id) as New_Customers 
    from Orders O1
    Where not exist 
      (select 1 
      from Orders O2 
      Where O2.date < date '2018-01-01'
      and O1.customer_id = O2.customer_id)
    and extract(YEAR from date) = '2018'
    

    干杯!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-23
      • 2021-11-09
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多