Sql 第一次下订单时获取日期和唯一客户数
我有一张名为orders的表格,看起来像这样: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 |
+--------------+---------+------+-----+---------+-------+
| 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: