product_id | user_id | product | date_opened
1 | 10 | shoes | 2016-04-01
2 | 26 | shoes | 2016-04-01
3 | 10 | watch | 2016-04-01
4 | 23 | shoes | 2016-04-01
5 | 10 | shoes | 2016-01-01
6 | 13 | watch | 2016-01-01
7 | 14 | shoes | 2015-11-02
8 | 10 | slippers| 2015-11-02
9 | 10 | shoes | 2015-11-02
10 | 15 | watch | 2015-11-02
11 | 19 | watch | 2015-09-03
12 | 19 | watch | 2015-03-02
13 | 19 | shoes | 2015-01-03
用户可以在开放时购买产品. date_open是日期周期.用户可以购买他想要的产品,例如user_id 10,用户10在2016-04-01周期有2个产品. 2016-01-01的一个产品,2015-11-02的两个产品.
现在,我想获得所有(不同的)user_id,他们在所有之前的3个周期日期(2016-04-01,2016-01-01和2015-11-02)都有活跃/有产品.
额外:
有效 – 应该在3个设定日期连续生产产品而不跳过.
因此,它应该在2016-04-01和2016-01-01和2015-11-02日期向所有用户显示产品.不是仅在1或2个日期的产品用户.
这里的另一个问题:例如,我有不同日期的用户(2000-04-05,2001-09-03,2006-09-01,2015-11-02等等.)我只想得到这里所有的那些有日期的用户(‘2016-04-01′,’2016-01-01′,’2015-11-02’).
解决方法:
SELECT USER_ID
FROM YOUR_TABLE OUTER_TABLE
WHERE 3 = (SELECT COUNT(disTINCT DATE_OPENED)
FROM YOUR_TABLE INNER_TABLE
WHERE DATE_OPENED IN ('2016-04-01', '2016-01-01', '2015-11-02')
AND OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID);
如果重写如下,该语句可能更快(未经测试):
SELECT disTINCT USER_ID
FROM YOUR_TABLE OUTER_TABLE
WHERE EXISTS (SELECT 1
FROM YOUR_TABLE INNER_TABLE
WHERE OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID
WHERE DATE_OPENED = '2016-04-01')
AND EXISTS (SELECT 1
FROM YOUR_TABLE INNER_TABLE
WHERE OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID
WHERE DATE_OPENED = '2016-01-01')
AND EXISTS (SELECT 1
FROM YOUR_TABLE INNER_TABLE
WHERE OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID
WHERE DATE_OPENED = '2015-11-02');