我正在尝试优化当前正在使用的查询:
SELECT `puid`, COUNT(DISTINCT `droid_v`) AS DROID, COUNT(DISTINCT `sig_v`) AS sig, SUM(NoExt) AS hits FROM temp GROUP BY `puid`
我需要得到它只能算droid_v其中droid_V大于0是否有可能以调节这样的计数?目前,它会将零值视为可计数值,而我无法真正将零更改为null值。
droid_v
droid_V
null
我不需要知道droid_V= 0的计数值,只需要对大于0的数字进行计数即可。该数字始终为0、1、2、3或4。
我试过了:
SELECT `puid`, COUNT(DISTINCT CASE WHEN `droid_v` > 0 THEN 1 END) AS DROID, COUNT(DISTINCT `sig_v`) AS sig, SUM(`NoExt`) AS hits FROM temp GROUP BY `puid`
但这给出的是二进制结果(0或1),而不是我期望的计数。
示例输出=
puid DROID sig hits No PUID 1 1 252 x-fmt/92 1 5 1008
预期输出:
puid DROID sig hits No PUID 1 1 252 x-fmt/92 3 5 1008
样本数据:
id;puid;droid_v;sig_v;speed;Ext;NoExt;tally 1;"No PUID";"3";"v13";"SLOW";"0";"63";"63" 2;"x-fmt/92";"3";"v13";"SLOW";"63";"0";"63" 3;"x-fmt/92";"3";"v37";"SLOW";"63";"63";"126" 4;"x-fmt/92";"3";"v45";"SLOW";"63";"63";"126" 5;"x-fmt/92";"3";"v49";"SLOW";"63";"63";"126" 6;"x-fmt/92";"3";"v50";"SLOW";"63";"63";"126" 7;"x-fmt/92";"5";"v13";"SLOW";"63";"0";"63" 8;"No PUID";"5";"v13";"SLOW";"0";"63";"63" 9;"x-fmt/92";"5";"v37";"SLOW";"63";"63";"126" 10;"x-fmt/92";"5";"v45";"SLOW";"63";"63";"126" 11;"x-fmt/92";"5";"v49";"SLOW";"63";"63";"126" 12;"x-fmt/92";"5";"v50";"SLOW";"63";"63";"126" 13;"No PUID";"6";"v13";"FAST";"0";"63";"63" 14;"x-fmt/92";"6";"v13";"SLOW";"63";"0";"63" 15;"No PUID";"6";"v13";"SLOW";"0";"63";"63" 16;"x-fmt/92";"6";"v13";"FAST";"63";"0";"63" 17;"x-fmt/92";"6";"v37";"SLOW";"63";"63";"126" 18;"x-fmt/92";"6";"v37";"FAST";"63";"63";"126" 19;"x-fmt/92";"6";"v45";"FAST";"63";"63";"126" 20;"x-fmt/92";"6";"v45";"SLOW";"63";"63";"126" 21;"x-fmt/92";"6";"v49";"FAST";"63";"63";"126" 22;"x-fmt/92";"6";"v49";"SLOW";"63";"63";"126" 23;"x-fmt/92";"6";"v50";"FAST";"63";"63";"126" 24;"x-fmt/92";"6";"v50";"SLOW";"63";"63";"126"
如果droid_v只能为0、1、2、3或4,则COUNT(DISTINCT)永远不会返回大于5的值,因为只有五个可能的值。那是你要的吗?如果是这样,请尝试以下操作:
SELECT puid, COUNT(DISTINCT CASE WHEN droid_v > 0 THEN droid_v ELSE 0 END) - 1 AS droid /* -1 for the case where droid_v is 0 */ , COUNT(DISTINCT sig_v) AS sig , SUM(NoExt) AS hits
更新: 哎呀,对不起,上面是不完全正确,因为可能不会 是 零。它应该是:
SELECT puid, COUNT(DISTINCT CASE WHEN droid_v > 0 THEN droid_v END) AS droid
另一方面,如果您希望对droid_v> 0的所有行进行计数,那么我认为您需要这样做:
SELECT puid, SUM(CASE WHEN droid_v > 0 THEN 1 ELSE 0 END) AS droid , COUNT(DISTINCT sig_v) AS sig , SUM(NoExt) AS hits
希望这可以帮助。