【发布时间】:2019-10-27 14:20:27
【问题描述】:
我有一个名为 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 |
+------+----------+--------------+
我想要一个返回每个唯一日期的结果集,以及一个单独的列,显示当天有多少客户下了他们的第一个订单。
我在以正确方式查询时遇到问题,尤其是当数据包含同一客户同一天的多个订单时。
我的方法是
- 获取在我要查看的时间段内下订单的所有唯一会员 ID
- 通过比较该时间段前下单的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;
但这会导致上述数据如下:
+--------------+--------------------------+
| deliverydate | COUNT(DISTINCT memberid) |
+--------------+--------------------------+
| 2019-10-25 | 2 |
| 2019-10-26 | 2 |
+--------------+--------------------------+
2019-10-26 的计数应该是 1。
感谢任何帮助:)
【问题讨论】:
标签: sql date group-by window-functions