Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我很难在一个简单的查询中输出正确的SQL代码_Mysql_Sql_Oracle_Sqlite - Fatal编程技术网

Mysql 我很难在一个简单的查询中输出正确的SQL代码

Mysql 我很难在一个简单的查询中输出正确的SQL代码,mysql,sql,oracle,sqlite,Mysql,Sql,Oracle,Sqlite,有一个具有以下属性的表: 订单:订单id、订单项目id、客户id、日期、产品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 分配这个的人看

有一个具有以下属性的表: 订单:订单id、订单项目id、客户id、日期、产品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条款完成了这一点,但我想不是


任何帮助都将不胜感激。

我认为这正是您努力实现的目标

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'

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

为了找出最早的最小购买日期,我们可以根据客户id分组,并使用MINdate。 但诀窍是我们不能应用WHERE子句,因为GROUPBY子句在WHERE子句之后执行,所以使用WHERE子句将删除实际记录和数据是不合适的。所以使用HAVING子句来过滤分组结果。 我想你想要像上面那样的东西。您必须创建一个按客户id划分并按日期升序排序的排名,以便每个客户首次购买的排名为1。然后,你只会在2018年拿到排名为1的订单,然后统计这些订单


此外,您可以将where子句更改为PUSHORE\u rank>1,并在select子句中将其更改为countdistinct customer\u id,然后您可以获得作为退货客户而不是新客户进行购买的客户数。

最简单的查询将使用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'

干杯

2您的查询存在问题1您正在计算订单而非客户a countdistinct会更好2您没有筛选订单超出您日期范围的客户,我不鼓励使用not在这种情况下,我可以想象为什么订单id可能位于订单项目表中,但我无法想象为什么order_item_id会出现在orders表中,找出您正在使用的RDBMS,然后发现您缺少EXISTS中的联接条件clause@Tejash,谢谢您的检查,我将其改为“不在中使用”。@jacob,如果它解决了您的问题,请接受以下答案:
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
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'