COUNT DISTINCT与GROUP BY不适用于> =

时间:2019-11-20 11:40:14

标签: mysql sql group-by distinct

我有这样的说法:

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。

我该如何解决?

2 个答案:

答案 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`);