计数函数返回零 - Mysql

时间:2014-03-21 22:20:59

标签: mysql sql

这是问题,

我有一张非常大的桌子:

Epoch_time              MAC
-------------------------------------
1395275303  |   84:xx:xx:xx:xx:xx 
1395275423  |   bc:xx:xx:xx:xx:xx 
1395275423  |   84:xx:xx:xx:xx:xx 

我想计算每小时独特的MAC地址。所以我做了这个

    SELECT Count(DISTINCT mac_adress), FROM_UNIXTIME(`date_ecoute`, '%d.%m.%Y.%H') as ndate FROM box1 
WHERE date_ecoute > unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 2640 MINUTE) 
AND signal_strength >= -60 group by ndate

效果很好,这是每小时的结果:

Count(DISTINCT mac_adress)  ndate
--------------------------------------
2              |          20.03.2014.03
8              |          20.03.2014.06
11             |          20.03.2014.07

问题是我的表中有几个小时没有行,所以你可以看到上面的结果没有20.03.2014.04甚至05的行。我想要这个输出:

  Count(DISTINCT mac_adress)    ndate
    --------------------------------------
    2              |          20.03.2014.03
    0              |          20.03.2014.04
    0              |          20.03.2014.05
    8              |          20.03.2014.06
    11             |          20.03.2014.07

我尝试了IS NULLIF NULLLEFT JOINCOALESCE。我不喜欢Sql ......

IFNULL(Count(DISTINCT mac_adress),0) // At the beginning, Doesn't work

1 个答案:

答案 0 :(得分:0)

如果您假设数据中的所有小时都有一些数据,那么您可以使用条件聚合来获取0。也就是说,在where子句中将条件从case子句移动到select语句:

SELECT Count(DISTINCT case when signal_strength >= -60 then mac_adress end),
      FROM_UNIXTIME(`date_ecoute`, '%d.%m.%Y.%H') as ndate
FROM box1 
WHERE date_ecoute > unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 2640 MINUTE) 
group by ndate
order by ndate;

如果您没有所有时间戳的数据,那么您将需要使用"驱动程序"表(或类似的)包含输出中所需的所有小时数。

编辑:

如果您每天都有数据,可以这样做:

SELECT d.ndate, h.hour,
       Count(DISTINCT case when then mac_adress end)
from (select distinct FROM_UNIXTIME(`date_ecoute`, '%d.%m.%Y') as ndate
      from box1
      where date_ecoute > unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 2640 MINUTE) 
     ) d cross join
     (select 0 as hour union all select 1 union all select 2 union all select 3 union all
      . . .
     ) h left outer join
     box1
where date_ecoute > unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 2640 MINUTE)  and
      signal_strength >= -60 
group by ndate, hour
order by min(dte_ecoute), hour;

让我补充一下。 。 。如果你有选择的话," YYYY-MM-DD" format最适合用于字符串表示。特别是,您可以直接使用它进行订购。