我有这样的说法:
SELECT
COUNT(DISTINCT(p.`id`)) as players,
COUNT(DISTINCT(IF(p.`created` >= 'startDate', p.`id`, NULL))) as newPlayers
FROM `player` p
WHERE p.`date` >= 'startDate' AND p.`date` < 'endDate'
GROUP BY DAY(p.`date`);
解释:
我有一段时间,例如:从2019-11-11到2019-12-13。
我想获取有关此期间(以天为单位)的玩家数量和newPlayers数量的信息。
玩家计数非常完美,但是newPlayers却没有。
它不是按天计算,而是按整个周期计算。
示例:
如果我在2019-11-13有1个newPlayer并且在2019-11-14还有1个新玩家-那么我想要2019-11-13的1个newPlayer编号和2019-11-14的1个新玩家-但我得到了1代表2019-11-13,2代表2019-11-14。
我该如何解决?
答案 0 :(得分:1)
我相信您需要这个:
SELECT COUNT(DISTINCT(p.id)) as players
, SUM(case when created >= startDate then 1 else 0 end) as newPlayers
FROM player p
WHERE date_c >= startDate
AND date_c < endDate
GROUP BY DAY(date_c);
更多细节,您需要向我们提供更多细节。 请注意,我已将列日期的名称更改为date_c。 干杯!
要回答第一条评论,您的查询也可以不加单引号就可以正常工作
SELECT
COUNT(DISTINCT(p.id)) as players,
COUNT(DISTINCT(IF(created >= startDate, id, NULL))) as newPlayers
FROM `player` p
WHERE date_c >= startDate
AND date_c < endDate
GROUP BY DAY(p.date_c);
这里是DEMO。我知道演示中的数据不是很好,但是...
另外,请注意,我在此DEMO中将AND date_c < endDate
更改为AND date_c <= endDate
,以便显示一些数据:)
它也可以使用正确的反引号``'',并且在您的代码中的某些地方,您使用的是``而不是this''。有一个区别:
SELECT
COUNT(DISTINCT(p.`id`)) as players,
COUNT(DISTINCT(IF(p.`created` >= p.`startDate`, p.`id`, NULL))) as newPlayers
FROM `player` p
WHERE p.`date_c` >= p.`startDate` AND p.`date_c` < `endDate`
GROUP BY DAY(p.`date_c`);
答案 1 :(得分:0)
此声明将为您提供请求期内每天的新玩家数量:
SELECT
DAY(p.`created`),
COUNT(DISTINCT(p.id)) as newPlayers
FROM `player` p
WHERE p.`date` >= 'startDate' AND p.`date` < 'endDate'
GROUP BY DAY(p.`created`);