Sql 第一次下订单时获取日期和唯一客户数

Sql 第一次下订单时获取日期和唯一客户数,sql,date,group-by,window-functions,Sql,Date,Group By,Window Functions,我有一张名为orders的表格,看起来像这样: +--------------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL |

我有一张名为orders的表格,看起来像这样:

+--------------+---------+------+-----+---------+-------+
| Field        | Type    | Null | Key | Default | Extra |
+--------------+---------+------+-----+---------+-------+
| id           | int(11) | YES  |     | NULL    |       |
| memberid     | int(11) | YES  |     | NULL    |       |
| deliverydate | date    | YES  |     | NULL    |       |
+--------------+---------+------+-----+---------+-------+
其中包含以下数据:

+------+----------+--------------+
| id   | memberid | deliverydate |
+------+----------+--------------+
|    1 |      991 | 2019-10-25   |
|    2 |      991 | 2019-10-26   |
|    3 |      992 | 2019-10-25   |
|    4 |      992 | 2019-10-25   |
|    5 |      993 | 2019-10-24   |
|    7 |      994 | 2019-10-21   |
|    6 |      994 | 2019-10-26   |
|    8 |      995 | 2019-10-26   |
+------+----------+--------------+
我想要一个返回每个唯一日期的结果集,以及一个单独的列,显示当天第一次下订单的客户数量

我在以正确的方式查询时遇到了问题,尤其是当数据由同一客户在同一天发出的多个订单组成时

我的方法是

获取在我要查看的时间段内下单的所有唯一MemberID 通过比较在时间段之前下单的MemberID,筛选出在此时间段内下单的成员 按交付日期分组,并计算所有唯一的MemberID,但这显然是每天单独计算唯一的MemberID! 下面是相应的SQL:

SELECT deliverydate,COUNT(DISTINCT memberid) FROM orders
WHERE 
    MemberId IN (SELECT DISTINCT memberid FROM orders WHERE deliverydate BETWEEN '2019-10-25' AND '2019-10-26')
AND NOT 
    MemberId In (SELECT DISTINCT memberid FROM orders WHERE deliverydate < '2019-10-25')
GROUP BY deliverydate
ORDER BY deliverydate ASC;
2019-10-26的计数应为1


感谢您的帮助:

您可以聚合两次:

select first_deliverydate, count(*) cnt
from (
    select min(deliverydate) first_deliverydate
    from orders
    group by memberid
) t
group by first_deliverydate
order by first_deliverydate
子查询提供每个成员的第一个订单数据,然后外部查询按第一个订单日期进行聚合和计数

这与您的示例数据一起返回:

first_deliverydate | cnt :----------------- | --: 2019-10-21 | 1 2019-10-24 | 1 2019-10-25 | 2 2019-10-26 | 1
您可以聚合两次:

select first_deliverydate, count(*) cnt
from (
    select min(deliverydate) first_deliverydate
    from orders
    group by memberid
) t
group by first_deliverydate
order by first_deliverydate
子查询提供每个成员的第一个订单数据,然后外部查询按第一个订单日期进行聚合和计数

这与您的示例数据一起返回:

first_deliverydate | cnt :----------------- | --: 2019-10-21 | 1 2019-10-24 | 1 2019-10-25 | 2 2019-10-26 | 1
您首先要确定第一次交货日期是什么时候:

SELECT firstdeliverydate,COUNT(DISTINCT memberid) FROM (
select memberid, min(deliverydate) as firstdeliverydate
from orders
WHERE 
    MemberId IN (SELECT DISTINCT memberid FROM orders WHERE deliverydate BETWEEN '2019-10-25' AND '2019-10-26')
AND NOT 
    MemberId In (SELECT DISTINCT memberid FROM orders WHERE deliverydate < '2019-10-25')
group by memberid)
t1
group by firstdeliverydate

您首先要确定第一次交货日期是什么时候:

SELECT firstdeliverydate,COUNT(DISTINCT memberid) FROM (
select memberid, min(deliverydate) as firstdeliverydate
from orders
WHERE 
    MemberId IN (SELECT DISTINCT memberid FROM orders WHERE deliverydate BETWEEN '2019-10-25' AND '2019-10-26')
AND NOT 
    MemberId In (SELECT DISTINCT memberid FROM orders WHERE deliverydate < '2019-10-25')
group by memberid)
t1
group by firstdeliverydate

获取每个不存在的客户的第一个订单,然后按deliverydate分组以统计下订单的不同客户:

select o.deliverydate, count(distinct o.memberid) counter
from orders o
where not exists (
  select 1 from orders
  where memberid = o.memberid and deliverydate < o.deliverydate
)  
group by o.deliverydate
但是,如果您想要表中所有日期的结果,包括没有新客户订单的日期,那么计数器将为0:


获取每个不存在的客户的第一个订单,然后按deliverydate分组以统计下订单的不同客户:

select o.deliverydate, count(distinct o.memberid) counter
from orders o
where not exists (
  select 1 from orders
  where memberid = o.memberid and deliverydate < o.deliverydate
)  
group by o.deliverydate
但是,如果您想要表中所有日期的结果,包括没有新客户订单的日期,那么计数器将为0: